2013-09-24 9 views
5

Co chcę zrobić, to powtórzyć wycenę do końca cytatu/(* cytat nie ma w nim nic). Czy mój kod jest prawidłowy?Jak wykonać pętlę ciągu utworzonego przez wskaźnik

char *quote = "To be or not to be, that is the question."; 
for (quote = 0; *quote != NULL; quote++){ 
*quote = tolower(*quote); 
} 
+3

Aby wyciąć do punktu, "quote = 0" jest niepoprawne. – Zong

+0

Dlaczego nie używać 'unsigned int'? – Recker

Odpowiedz

11

Prawdopodobnie potrzebujesz innego wskaźnika do przejścia przez tablicę, w przeciwnym razie dostęp do oryginalnego łańcucha zostanie utracony.

Najlepiej używać tylko wskaźników NULL.

Nie używaj wartości 0 jako wartości początkowej, chyba że chcesz użyć indeksów (patrz poniżej).

Wykonanie char *quote = po prostu sprawi, że quote wskaże literał tylko do odczytu, zamiast kopiować ciąg. Zamiast tego użyj char quote[] =.

char quote[] = "To be or not to be, that is the question."; 
char *quotePtr; 
for (quotePtr = quote; *quotePtr != '\0'; quotePtr++){ 
    *quotePtr = tolower(*quotePtr); 
} 

Test.

Korzystanie indeksy:

char quote[] = "To be or not to be, that is the question."; 
int i; 
for (i = 0; quote[i] != '\0'; i++){ 
    quote[i] = tolower(quote[i]); 
} 

Test.

+1

Wiesz, że jest to najprawdopodobniej wysadzić w powietrze z powodu naruszenia zasad dostępu, ponieważ literał jest na stronie tylko do odczytu? – ChrisWue

+0

@ChrisWue Oh racja, dzięki, naprawione. – Dukeling

+0

@Dukeling: - doing char * quote = "być lub nie .... pytanie"; i wzięcie innego znaku * quotePtr = quote; to samo można zrobić ... co jest nie tak z podjęciem char * quote = "być albo nie ... pytanie" ... – kTiwari

0

Przenosisz quote do swojego inicjatora for, który jest nieprawidłowy i spowoduje naruszenie zasad dostępu, ponieważ usuwasz go z części *quote != NULL.

Semantycznie NULL i '\0' są równoważne, ale syntaktycznie wolałbym to. Zauważ, że za pomocą tego podejścia utrzymujesz wskaźnik na (początku) ciągu znaków.

wchar const_t* quote = L"To be or not to be, that is the question."; 

for(wchar_t* c = quote; *c != '\0'; c++) { 

    *c = tolower(*c); 
} 

alternatywnie za pomocą wskaźnika:

wchar const_t quote[] = L"To be or not to be, that is the question."; 

for(size_t i = 0; i < sizeof(quote); i++) { 

    quote[i] = tolower(quote[i]); 
} 

(Uwaga semantyka sizeof zmienia się, gdy wartość quote nie jest znana w czasie kompilacji)

+0

Dlaczego ponowne przydzielanie odwołań do wskaźnika jest nieprawidłowe? Twój kod robi to samo, więc prawdopodobnie twoje powody są po prostu niepoprawne. – Dukeling

+0

'wchar const_t * quote' jest ciągłym dosłownym ciągiem literowym, którego nie można zmodyfikować, aby kod się nie powiódł. – ChrisWue

2

uznać to rozszerzenie do odpowiedź udzielona przez Dukeling

Podczas korzystania z

char *quote = "Hello World"; 

To powoduje, że ciąg do odczytu oznacza, że ​​nie można zmienić jego zawartości w prostszy sposób.

Here *quote points to 'H' 
BUT, you cannot do *quote = 'A'; 
This will give you an error. 

Jeśli chcesz wprowadzić zmiany w znakach w ciągu znaków, dobrym zwyczajem jest używanie tablic.

char quote[] = "Hello World"; 
Here also *quote points to 'H' 
BUT, in this case *quote = 'A' is perfectly valid. 
The array quote will get changed. 
Powiązane problemy