2013-06-14 14 views
5

Oto co mam:Inkrementacji wskaźniki dla char * w pętli while

char* input = new char [input_max] 
char* inputPtr = iput; 

chcę użyć inputPtr przemierzać układ wejściowy. Jednak nie jestem pewien, co będzie prawidłowo sprawdzić, czy nie doszedłem do końca łańcucha:

while (*inputPtr++) 
{ 
    // Some code 
} 

lub

while (*inputPtr != '\0') 
{ 
    inputPtr++; 
    // Some code 
} 

lub bardziej eleganckim rozwiązaniem?

+0

Są one równoważne. Oczywiście musisz upewnić się, że w tablicy znajduje się '\ 0'. – juanchopanza

+0

To jest pytanie o to, co umieścisz w swojej tablicy. Czy na pewno masz element "0 \" w swojej tablicy? Jeśli tak, to czy na pewno element ''\ 0'' znajduje się w granicach tablicy? –

+0

Jestem nowy w programowaniu, więc przepraszam, jeśli to, o co pytam, jest zbędne, ale jest "\ 0" == 0? – Bbvarghe

Odpowiedz

9

Zakładając ciąg wejściowy jest zakończony znakiem null:

for(char *inputPtr = input; *inputPtr; ++inputPtr) 
{ 
    // some code 
} 

Należy pamiętać, że przykład pan pisał nie może dać pożądane wyniki. W stanie pętli while zawsze wykonywany jest post-inkrement. Kiedy jesteś w pętli, minąłeś już pierwszą postać. Weźmy ten przykład:

#include <iostream> 
using namespace std; 

int main() 
{ 
    const char *str = "apple\0"; 
    const char *it = str; 
    while(*it++) 
    { 
    cout << *it << '_'; 
    } 
} 

This wyjścia:

p_p_l_e__

Wskazówka brakującym pierwszy znak, a dodatkowo _ podkreślenia na końcu. Jeśli nie masz pewności co do operatorów pre-increment i post-increment, sprawdź numer this related question.

2

Zakładając wejście nie jest null rozwiązana:

char* input = new char [input_max]; 
for (char* inputPtr = input; inputPtr < input + input_max; 
     inputPtr++) { 
    inputPtr[0]++; 
} 

dla zerowej zakończonego postępowania:

for (char* inputPtr = input; inputPtr[0]; inputPtr++) { 
     inputPtr[0]++; 
} 

ale ogólnie to jest tak dobre, jak można dostać. Korzystanie z opcji std::vector lub std::string może jednak umożliwić korzystanie z bardziej przejrzystych i czystszych opcji.

+0

kiedy wejście NIE może być zakończone znakiem zerowym? – Bbvarghe

+2

nie wszystko jest ciągiem znaków. może to być wektor liczb lub jakaś tabela, a w tych przypadkach wartość null jest po prostu inną wartością – perreal

+0

Nie nauczyłem się jeszcze wektorów, ale dobrze o tym pamiętać, dziękuję! – Bbvarghe

2

zrobiłbym:

inputPtr = input; // init inputPtr always at the last moment. 
while (*inputPtr != '\0') {  // Assume the string last with \0 
     // some code 
     inputPtr++; // After "some code" (instead of what you wrote). 
} 

co jest równoznaczne z pętli for sugeruje greatwolf. To osobisty wybór.

Uważaj, przy obu przykładach testujesz bieżącą pozycję, a następnie zwiększasz. Dlatego używasz następnej postaci!

+0

Czy w takim razie lepiej byłoby, gdybym trzymał się moich przykładów? – Bbvarghe

+1

Do-while oznaczałoby: test po wykonaniu kodu, aw konsekwencji zawsze wykonaj co najmniej jeden raz pętlę. To może być przydatne, jeśli chcesz na przykład rozważyć znak '\ 0'. Ale to nie byłoby równoznaczne z twoimi przykładami. –