Muszę stworzyć program, który pobiera dane wejściowe od użytkownika, a następnie zwraca liczbę słów wprowadzonych do ciągu. Przechowuję dane wejściowe użytkownika w tablicy char words[256];
Mam funkcję o nazwie countWords
. Zapętla się przez tablicę i jeśli napotka pole, jego licznik jest zwiększany. if(words[i] == " ")
po osiągnięciu znaku zerowego licznik jest zatrzymywany. Potem wraca nSpaces + 1
wziąć pod uwagę pierwsze słowo.
Ale moje dane wyjściowe wydają się zamiast tego wytwarzać liczbę znaków w ciągu. Jak to może zostać naprawione.
#include <iostream>
#include <cstdlib>
using namespace std;
//Function Prototype
int countWords(char words[]);
int main(){
char words[256];
cout << "Enter a sentence: ";
cin.getline(words, 256);
int word_num = countWords(words);
cout << "The number of words in a string is: " << word_num << endl;
system("PAUSE");
return 0;
}
int countWords(char words[]){
int nSpaces = 0;
//unsigned int i = 0;
/*while(isspace(words[i])){
i++;
}*/
for (int i=0; i<256; i++){
if(isspace(words[i])){
nSpaces++;
// Skip over duplicate spaces & if a NULL character is found, we"re at the end of the string
//while(isspace(words[i++]))
if(words[i] == " ")
nSpaces--;
}
}
// The number of words = the number of spaces + 1
return nSpaces + 1;
}
Wynik to:
Enter a sentence: Yury Stanev
The number of words in a string is: 7
Odpowiedzi:
2 dla odpowiedzi № 1Nie zatrzymujesz pętli, gdy dojdziesz do znaku zerowego. Testujesz tylko znak zerowy wewnątrz if(isspace(words[i]))
blok, ale jeśli znak jest spacją, to onnie może być również terminatorem zerowym. W rezultacie czytasz poza koniec danych wejściowych i zliczasz spacje w niezainicjowanej części łańcucha.
int countWords(char words[]){
int nSpaces = 0;
for (int i=0; i<256 && words[i] != " "; i++){
if(isspace(words[i])){
nSpaces++;
}
}
// The number of words = the number of spaces + 1
return nSpaces + 1;
}
0 dla odpowiedzi nr 2
isspace
zlicza nowe linie (n), tabulatory (t), v, f i r.
Prawdopodobnie chcesz tylko białych znaków? Sprawdź tylko „” i „t”.