2012-04-09 3 views
1

Ich arbeite an meiner C++ - Übungsfrage, um mich auf meinen bevorstehenden Test vorzubereiten, und ich kämpfe mit einer For-Loop-Bedingung, die ich noch nie zuvor gesehen habe.Wann wird die Bedingung für diese Schleife falsch?

 for (int i = 0; s[i]; i++) 

Der String s, die von der Haupt ist "Two roofs to fix"

ist die Frage gesendet wurde, wenn die für die Bedingung der Schleife wird falsch sein?

+4

Hinweis: Die Zeichenkette '" Zwei zu reparierende Dächer '' hat einen Null-Terminator am Ende der Zeichenkette. Was glauben Sie, was ein Null-Terminator im zweiten Ausdruck der For-Schleife auswertet? –

+1

Also was sagst du, ist nach der Zeichenfolge sollte es aufhören, weil es nicht weiter als das richtig gehen kann? – Ali

+1

@Ali: Der Null-Terminator '\ 0' am Ende der Zeichenfolge hat den Wert Null, was in false konvertiert wird. –

Antwort

5

Die Schleifenbedingung wird falsch, wenn der String mit der Endnummer '\0' erreicht wird. (if (0) ergibt False)

Bitte beachten Sie: Diese Form des Tests ist ein möglicher Fehler, der darauf wartet, dass die Zeichenfolge nicht null endet.

+2

-1: Wenn er wusste, dass Strings in '\ 0' endete, bin ich ziemlich sicher, dass er die Frage nicht gestellt hätte. –

+7

willst du mir -1 für eine richtige Antwort geben? –

+1

Nein, für einen * unvollständigen * einen. –

2

Um @ MitchWheats Antwort zu klären, wenn ein Ausdruck, der als Bedingung verwendet wird, nur einen Wert angibt, wie if (x), entspricht er im Wesentlichen if (x != 0). Wenn der Wert ein Zeigertyp ist, entspricht er stattdessen if (x != NULL) (obwohl das nicht wirklich ein "stattdessen" ist, da NULL == 0).

1
#include<iostream> 
#include<string> 

using namespace std; 

int main() 
{ 
    string s = "Two roofs to fix"; 
    int i; 
    for (i = 0; s[i]; i++); 
    cout<<"i = "<<i<<endl; 
} 

Ich teste das Problem mit dem obigen Code. Es wird ein Fehler "Zeichenfolge-Index außerhalb des Bereichs" zurückgegeben. Wenn also die Länge der Zeichenfolge s Len ist, ist s [Len] ungültig. In Ihrem Code ist s kein Zeigerzeichen *, sondern eine Zeichenfolge. Es ist also unangemessen, so zu programmieren.

+1

Er sagte String, aber er war nicht klar über 'std :: string' oder' char * '. Da er keine Fehler erwähnt, würde ich annehmen, dass es "char * s;" ist – loganfsmyth

Verwandte Themen