2012-10-02 43 views
5

Necesito escribir una función que cuente palabras en una cadena. Para el propósito de esta asignación, una "palabra" se define como una secuencia de caracteres no nulos, espacios en blanco, separados de otras palabras por espacios en blanco .Contando palabras en una cadena - programación c

Esto es lo que tengo hasta ahora:

int words(const char sentence[ ]); 

int i, length=0, count=0, last=0; 
length= strlen(sentence); 

for (i=0, i<length, i++) 
if (sentence[i] != ' ') 
    if (last=0) 
     count++; 
    else 
     last=1; 
else 
    last=0; 

return count; 

No estoy seguro de si funciona o no, porque no puedo probarlo hasta que finalice todo mi programa y no estoy seguro de que funcionará, ¿Hay una mejor manera de escribir esta función?

+1

La etiqueta de la tarea es [obsoleta] (http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated). Por favor no lo uses En cuanto a su pregunta, mi primer pensamiento fue 'strtok', ya que separar cosas es lo que debe hacer. De todos modos, 'if (sentencia [i]> = '!' && oración [i]> = '~')' tiene algo un poco incorrecto más allá de confiar en ASCII para ser utilizado. – chris

+0

¿Cuál es el punto de '!' Y '~'? * Todo * lo que no es espacio en blanco es parte de una palabra. –

+0

Gracias, así que lo cambié a! = '' – PhillToronto

Respuesta

6

Usted necesita

int words(const char sentence[]) 
{ 
} 

(frenos nota).

Para bucles vaya con ; en lugar de ,.


Sin ningún tipo de renuncia, aquí es lo que yo he escrito:

verlo en directo http://ideone.com/uNgPL

#include <string.h> 
#include <stdio.h> 

int words(const char sentence[ ]) 
{ 
    int counted = 0; // result 

    // state: 
    const char* it = sentence; 
    int inword = 0; 

    do switch(*it) { 
     case '\0': 
     case ' ': case '\t': case '\n': case '\r': // TODO others? 
      if (inword) { inword = 0; counted++; } 
      break; 
     default: inword = 1; 
    } while(*it++); 

    return counted; 
} 

int main(int argc, const char *argv[]) 
{ 
    printf("%d\n", words("")); 
    printf("%d\n", words("\t")); 
    printf("%d\n", words(" a  castle  ")); 
    printf("%d\n", words("my world is a castle")); 
} 
3

Vea el siguiente ejemplo, puede seguir el enfoque: cuente los espacios en blanco entre las palabras.

int words(const char *sentence) 
{ 
    int count=0,i,len; 
    char lastC; 
    len=strlen(sentence); 
    if(len > 0) 
    { 
     lastC = sentence[0]; 
    } 
    for(i=0; i<=len; i++) 
    { 
     if((sentence[i]==' ' || sentence[i]=='\0') && lastC != ' ') 
     { 
      count++; 
     } 
     lastC = sentence[i]; 
    } 
    return count; 
} 

Para probar:

int main() 
{ 
    char str[30] = "a posse ad esse"; 
    printf("Words = %i\n", words(str)); 
} 

Salida:

Words = 4 
+0

Hola @aleroot gracias. El problema con eso es que si hay un espacio al principio de la oración contará 5 – PhillToronto

+0

@PhillToronto ver que la actualización de mi respuesta está solucionada ahora, sé que no es perfecta, pero podría ser un buen punto de partida. .. – aleroot

+0

@aleroot "count" debe inicializarse con cero. Su código actual da error porque el recuento no se inicializa con cero por lo que no se puede incrementar. – furqan

2
#include <ctype.h> // isspace() 

int 
nwords(const char *s) { 
    if (!s) return -1; 

    int n = 0; 
    int inword = 0; 
    for (; *s; ++s) { 
    if (!isspace(*s)) { 
     if (inword == 0) { // begin word 
     inword = 1; 
     ++n; 
     } 
    } 
    else if (inword) { // end word 
     inword = 0; 
    } 
    } 
    return n; 
} 
0

Aquí hay otra solución:

#include <string.h> 

int words(const char *s) 
{ 
    const char *sep = " \t\n\r\v\f"; 
    int word = 0; 
    size_t len; 

    s += strspn(s, sep); 

    while ((len = strcspn(s, sep)) > 0) { 
     ++word; 
     s += len; 
     s += strspn(s, sep); 
    } 
    return word; 
} 
-1

Aquí hay una solución. Éste contará palabras correctamente incluso si hay espacios múltiples entre palabras, no hay espacios alrededor de símbolos de interpuncion, etc. Por ejemplo: Yo soy, Mi madre es. Elefantes, vuelen lejos.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 


int countWords(char*); 


int main() { 
    char string[1000]; 
    int wordsNum; 

    printf("Unesi nisku: "); 
    gets(string); /*dont use this function lightly*/ 

    wordsNum = countWords(string); 

    printf("Broj reci: %d\n", wordsNum); 

    return EXIT_SUCCESS; 
} 


int countWords(char string[]) { 
    int inWord = 0, 
     n, 
     i, 
     nOfWords = 0; 

    n = strlen(string); 

    for (i = 0; i <= n; i++) { 
     if (isalnum(string[i])) 
      inWord = 1; 
     else 
      if (inWord) { 
       inWord = 0; 
       nOfWords++; 
      } 
    } 

    return nOfWords; 
} 
+0

"no use esta función a la ligera"? Probablemente quiso decir "no use esta función en absoluto". –

0
#include<stdio.h> 

int main() 
{  
char str[50];  
int i, count=1; 
printf("Enter a string:\n");  
gets(str);  
for (i=0; str[i]!='\0'; i++) 
     { 
     if(str[i]==' ')  
       { 
       count++; 
       } 
     } 
printf("%i\n",count);  
} 
2
bool isWhiteSpace(char c) 
{ 
    if(c == ' ' || c == '\t' || c == '\n') 
     return true; 
    return false; 
} 

int wordCount(char *string) 
{ 
    char *s = string; 
    bool inWord = false; 
    int i = 0; 

    while(*s) 
    { 
     if(isWhiteSpace(*s)) 
     { 
      inWord = false; 
      while(isWhiteSpace(*s)) 
       s++; 
     } 
     else 
     { 
      if(!inWord) 
      { 
       inWord = true; 
       i++; 
      } 
      s++; 
     } 
    } 

    return i; 
} 
0
#include<stdio.h> 
#include<string.h> 

int getN(char *); 


int main(){ 
    char str[999]; 
    printf("Enter Sentence: "); gets(str); 
    printf("there are %d words", getN(str)); 
} 


int getN(char *str){ 
    int i = 0, len, count= 0; 
    len = strlen(str); 
    if(str[i] >= 'A' && str[i] <= 'z') 
     count ++; 


    for (i = 1; i<len; i++) 
     if((str[i]==' ' || str[i]=='\t' || str[i]=='\n')&& str[i+1] >= 'A' && str[i+1] <= 'z') 
     count++; 


return count; 
} 
+0

Esto funcionará? – sheehab

0
#include <stdio.h> 

int wordcount (char *string){ 

    int n = 0; 

    char *p = string ; 
    int flag = 0 ; 

    while(isspace(*p)) p++; 


    while(*p){ 
     if(!isspace(*p)){ 
      if(flag == 0){ 
       flag = 1 ; 
       n++; 
      } 
     } 
     else flag = 0; 
     p++; 
    } 

    return n ; 
} 


int main(int argc, char **argv){ 

    printf("%d\n" , wordcount(" hello world\nNo matter how many newline and spaces")); 
    return 1 ; 
} 
-1

Ésta es una función simple para calcular el número de palabras

int counter_words(char* a){` 

// go through chars in a 
// if ' ' new word 
int words=1; 
int i; 
for(i=0;i<strlen(a);++i) 
{ 
     if(a[i]==' ' && a[i+1] !=0) 
     { 
      ++words; 
     } 
} 

return words;}

0

I encontré la pregunta publicada después de terminar mi función para una clase C que estoy tomando. Vi algunas buenas ideas del código que la gente publicó anteriormente. Esto es lo que se me ocurrió para obtener una respuesta. Ciertamente no es tan conciso como el de los demás, pero funciona. Tal vez esto ayudará a alguien en el futuro.

Mi función recibe una matriz de caracteres en.Luego configuré un puntero a la matriz para acelerar la función si se amplió. Luego encontré la longitud de la cuerda para repetir. Luego uso la longitud de la cuerda como máximo para el ciclo 'for'. Luego verifico el puntero que está mirando la matriz [0] para ver si es un carácter o puntuación válida. Si el puntero es válido, entonces incremente al siguiente índice de matriz. El contador de palabras se incrementa cuando fallan las dos primeras pruebas. La función aumentará luego en cualquier cantidad de espacios hasta que se encuentre el siguiente carácter válido. La función finaliza cuando se encuentra el carácter nulo '\ 0' o una nueva línea '\ n'. La función incrementará el recuento una última vez justo antes de salir para dar cuenta de la palabra que precede a null o newline. La función vuelve a contar para la función de llamada.

#include <ctype.h> 

char wordCount(char array[]) { 
    char *pointer; //Declare pointer type char 
    pointer = &array[0]; //Pointer to array 

    int count; //Holder for word count 
    count = 0; //Initialize to 0. 

    long len; //Holder for length of passed sentence 
    len = strlen(array); //Set len to length of string 

    for (int i = 0; i < len; i++){ 

     //Is char punctuation? 
     if (ispunct(*(pointer)) == 1) { 
      pointer += 1; 
      continue; 
     } 
     //Is the char a valid character? 
     if (isalpha(*(pointer)) == 1) { 
      pointer += 1; 
      continue; 
     } 
     //Not a valid char. Increment counter. 
     count++; 

     //Look out for those empty spaces. Don't count previous 
     //word until hitting the end of the spaces. 
     if (*(pointer) == ' ') { 
      do { 
       pointer += 1; 
      } while (*(pointer) == ' '); 
     } 

     //Important, check for end of the string 
     //or newline characters. 
     if (*pointer == '\0' || *pointer == '\n') { 
      count++; 
      return(count); 
     } 
    } 
    //Redundent return statement. 
    count++; 
    return(count); 
} 
Cuestiones relacionadas