While-Schleife nicht zu sehen, oder die Suche nach abschließenden null-Zeichens
Ich versuche, Durchlaufen ein char-array mit Hilfe einer while-Schleife mit '\0' als abschließende Bedingung, aber mein problem ist, dass Sie nicht finden, die '\0' bis der index-position 481, das array ist deklariert als 200 lange und ich kann nicht sehen, was ich falsch mache!! Ich kann nicht verwenden, Zeichenfolgen oder jegliche form von string-Funktionen für diese, bevor jemand fragt. Kann mir jemand helfen????
#include <iostream>
using namespace std;
int main()
{
char fullString[200]={'\0'}; //Declare char string of 200, containing null characters
int alphaCount = 0;
int charCount = 0;
int wordCount = 0;
cin.getline(fullString,200); //
cout << "\n\n" << fullString;
cout << "\n\n\n";
int i=0;
int i2 = 0;
while(fullString[i]!='\0'){ //iterate through array until NULL character is found
cout << "\n\nIndex pos : " << fullString[i]; //Output char at 'i' position
while(fullString[i2]!= ' '){ //while 'i' is not equal to SPACE, iterate4 through array
if(isalpha(fullString[i2])){
alphaCount++; //count if alpha character at 'i'
}
charCount++; //count all chars at 'i'
i2++;
}
if(charCount == alphaCount){ //if charCount and alphaCount are equal, word is valid
wordCount++;
}
charCount = 0; //zero charCount and alphaCount
alphaCount = 0;
i=i2;//Assign the position of 'i2' to 'i'
while(fullString[i] == 32){ //if spaces are present, iterate past them
i++;
cout << "\n\ntest1";
}
i2 = i; //assign value of 'i' to 'i2' which is the next position of a character in the array
if(fullString[i] == '\0')
{
cout << "\n\nNull Character " << endl;
cout << "found at pos: " << i << endl;
}
}
cout << "\n\ni" << i;
cout << "\n\nWord" << wordCount;
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere haben darauf hingewiesen, Ihr problem ist mit der inneren Schleife. Testen Sie ein Leerzeichen, aber nicht NULL, also ist die Iteration über das Ende das Letzte Wort, weil es keine Leerzeichen nach dem letzten Wort.
Dies ist leicht behoben werden, indem Sie Ihre while-Bedingung von diesem:
... zu diesem:
Dies wird sich ändern Sie Ihre innere while-Schleife zum ersten test für nicht NULL ist, und dann test für nicht-Raum.
Ich bin nicht korrigiert wird, wie der rest deines Codes, da ich vermute, das ist ein Klasse Projekt (es sieht aus wie einer), also bin ich die Begrenzung meiner Antwort auf den Umfang Ihrer Frage.
Ist es, weil die inneren Schleifen nicht überprüfen, für die Kündigung, Sie einfach weiter Schleife noch hinter dem Ende der Zeichenfolge.
Durch die Art und Weise, wenn Sie wollen, um die Anzahl der Wörter, Leerzeichen und nicht-Leerzeichen, es gibt einfachere Wege, in C++. Siehe z.B.
std::count
undstd::count_if
für die Räume und Zeichen. Zum Beispiel:Für die Zählung der Wörter, die Sie verwenden können,
std::istringstream
,std::vector
,std::copy
,std::istream_iterator
und, std::back_inserter
:Nach dem code oben, der Größe der
words
Vektor ist die Anzahl der Wörter.Wenn Sie z.B.
std::copy_if
dann können Sie mit dem obigen code für den anderen Fällen auch (aberstd::count_if
ist besser für die einzelnen Charakter-Klassen).Sie nicht prüfen in der inneren Schleife
ob das nächste Zeichen gleich '\0'