Трябва да направя програма, която да вземе вход от потребителя и след това да върне броя на думите, въведени в низ. Съхранявам потребителски вход в масив char words[256];
Имам функция, наречена countWords
, Тя се върти през масива и ако срещне пространство, той се увеличава. if(words[i] == " ")
ако се достигне нулев знак, броячът се спира. След това се връща nSpaces + 1
да отчете първата дума.
Но моят изход изглежда произвежда броя на знаците в низ вместо това. Как може да се определи това.
#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;
}
Резултатът е:
Enter a sentence: Yury Stanev
The number of words in a string is: 7
Отговори:
2 за отговор № 1Вие не спирате цикъла, когато стигнете до нулевия символ. Вие само тествате за нулевия знак вътре в if(isspace(words[i]))
блок, но ако знакът е пространство, то тогаване може да бъде "null" терминатор. В резултат, вие четете покрай края на входа и преброявате пространствата в неинициализираната част на низа.
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 за отговор № 2
isspace
брои нови линии (n), tabs (t), v, f и r.
Може би искате само бели пространства? Проверете само за "" и "t".