2013-09-24 11 views
5

Quello che voglio fare è iterare attraverso la citazione fino alla fine della citazione/(* citazione non ha nulla in essa). Il mio codice è valido?Come eseguire il ciclo di una stringa creata dal puntatore

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

Per tagliare al punto, 'quote = 0' non è corretto. – Zong

+0

Perché non usare 'unsigned int'? – Recker

risposta

11

Probabilmente è necessario un altro puntatore per attraversare l'array, altrimenti l'accesso alla stringa originale verrà perso.

E preferibilmente utilizzare solo NULL per i puntatori.

Non utilizzare 0 come valore iniziale, a meno che non si desideri utilizzare indici invece (vedere di seguito).

Fare char *quote = farà semplicemente il punto quote al letterale di sola lettura, invece di copiare la stringa. Utilizzare invece 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.

Uso indici:

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

Sapete che è più probabile che si verifichi una violazione di accesso a causa della presenza letterale delle stringhe in una pagina di sola lettura? – ChrisWue

+0

@ChrisWue Oh, giusto, grazie, risolto. – Dukeling

+0

@Dukeling: - facendo char * quote = "essere o non .... domanda"; e prendendo un altro char * quotePtr = quote; la stessa cosa può essere fatta .. cosa c'è di sbagliato nel prendere char * quote = "essere o non ... domanda" ... – kTiwari

0

Si sta riassegnando quote nel proprio inizializzatore for, che non è valido e causerà una violazione di accesso perché si sta effettuando il deferenziamento nella parte *quote != NULL.

Semanticamente NULL e '\0' sono equivalenti, ma sintatticamente preferirei questo. Si noti che usando questo approccio si mantiene un puntatore (all'inizio) della stringa.

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); 
} 

alternativamente utilizzando un indice:

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]); 
} 

(notare che la semantica di sizeof cambia se il valore di quote non è noto al momento della compilazione)

+0

Perché la riassegnazione e il dereferenziamento di un puntatore non sono validi? Il tuo codice fa lo stesso, quindi presumibilmente le tue ragioni sono errate. – Dukeling

+0

'wchar const_t * quote' è una costante letterale di stringa che non è possibile modificare in modo che il codice non riesca. – ChrisWue

2

considerare questo come un ampliamento la risposta data da Dukeling

Quando si utilizza

char *quote = "Hello World"; 

Questo rende una stringa di sola lettura, significa che non è possibile modificare il suo contenuto in un modo più semplice.

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

Se si desidera apportare modifiche ai caratteri in una stringa, è buona norma utilizzare gli array.

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. 
Problemi correlati