Necesito hacer un programa que reciba información del usuario y luego devuelva el número de palabras ingresadas en la cadena. Almaceno la entrada del usuario en una matriz char words[256];
Tengo una función llamada countWords
. Recorre la matriz y, si encuentra un espacio, el contador aumenta. if(words[i] == " ")
Si se alcanza el carácter nulo, el contador se detiene. Luego vuelve nSpaces + 1
para dar cuenta de la primera palabra.
Pero mi salida parece producir el número de caracteres en la cadena en su lugar. Cómo se puede arreglar esto.
#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;
}
La salida es:
Enter a sentence: Yury Stanev
The number of words in a string is: 7
Respuestas
2 para la respuesta № 1No está deteniendo el bucle cuando llega al carácter nulo. Solo está probando el carácter nulo dentro del if(isspace(words[i]))
bloque, pero si el personaje es un espacio, entoncestampoco puede ser el terminador nulo. Como resultado, está leyendo más allá del final de la entrada y contando los espacios en la parte no inicializada de la cadena.
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 para la respuesta № 2
isspace
cuenta nuevas líneas (n), tabulaciones (t), v, fy r.
¿Probablemente solo quieres espacios en blanco? Verifique solo "" y "t".