web-dev-qa-db-fra.com

Compter les mots dans une chaîne - programmation c

Je dois écrire une fonction qui comptera les mots dans une chaîne. Pour les besoins de cette affectation, un "mot" est défini comme une séquence de caractères non-nuls, sans espaces, séparés des autres mots par des espaces.

Voici ce que j'ai jusqu'à présent:

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;

Je ne sais pas si cela fonctionne ou non, car je ne peux pas le tester avant la fin de mon programme et je ne suis pas sûr que cela fonctionnera. Existe-t-il une meilleure façon d'écrire cette fonction?

6
PhillToronto

Vous aviez besoin

int words(const char sentence[])
{
}

(notez les accolades).

Pour les boucles, utilisez ; au lieu de ,.


Sans aucune clause de non-responsabilité, voici ce que j'aurais écrit:

Voir en directhttp://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"));
}
6
sehe

Voir l'exemple suivant, vous pouvez suivre l'approche suivante: compter l'espace entre les mots.

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;
}

Tester :

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

Sortie:

Words = 4
3
aleroot
#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;
}
2
jfs
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;
}
1
Andrew Bryant
#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
sheehab
#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 ;
}
0
Tite

J'ai trouvé la question postée à la fin de ma fonction pour un cours de classe C que je suis en train de suivre. J'ai vu quelques bonnes idées de personnes de code ont posté ci-dessus. Voici ce que je suis venu avec une réponse. Ce n’est certainement pas aussi concis que les autres, mais cela fonctionne. Peut-être que cela aidera quelqu'un dans le futur.

Ma fonction reçoit un tableau de caractères. J'ai ensuite défini un pointeur sur le tableau pour accélérer la fonction si elle était mise à l'échelle. Ensuite, j'ai trouvé la longueur de la chaîne à boucler. J'utilise ensuite la longueur de la chaîne comme maximum pour la boucle 'pour'. Je vérifie ensuite le pointeur qui regarde le tableau [0] pour voir s’il s’agit d’un caractère ou d’une ponctuation valide. Si le pointeur est valide, incrémenter au prochain index du tableau. Le compteur de mots est incrémenté lorsque les deux premiers tests échouent. La fonction incrémentera alors sur n'importe quel nombre d'espaces jusqu'à ce que le prochain caractère valide soit trouvé. La fonction se termine lorsqu'un caractère nul '\ 0' ou une nouvelle ligne '\ n' est trouvé. La fonction incrémentera une dernière fois le compte juste avant de quitter pour prendre en compte le mot précédant null ou une nouvelle ligne. Fonction renvoie le nombre à la fonction appelante.

#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);
}
0
Pkin

Voici une autre solution:

#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;
}
0
William Morris

J'avais ceci comme une mission ... donc je sais que ça marche. La fonction vous donne le nombre de mots, la longueur moyenne des mots, le nombre de lignes et le nombre de caractères. Pour compter les mots, vous devez utiliser isspace () pour vérifier les espaces. si isspace vaut 0, vous savez que vous ne lisez pas d'espaces. wordCounter est juste un moyen de garder une trace de lettres consécutives. Une fois dans un espace, réinitialisez le compteur et incrémentez wordCount. Mon code ci-dessous:

Utilisez isspace (c) pour

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

int main() {
  int lineCount = 0;
  double wordCount = 0;
  double avgWordLength = 0;
  int numLines = 0;
  int wordCounter = 0;
  double nonSpaceChars = 0;
  int numChars = 0;
  printf("Please enter text.  Use an empty line to stop.\n"); 
  while (1) {
      int ic = getchar();
      if (ic < 0)    //EOF encountered
          break;
      char c = (char) ic;
      if (isspace(c) == 0 ){
      wordCounter++;
      nonSpaceChars++;
    }
      if (isspace(c) && wordCounter > 0){
      wordCount++;
      wordCounter =0;
    }
      if (c == '\n' && lineCount == 0) //Empty line
      { 
          break; 
      }
      numChars ++;
      if (c == '\n') {
          numLines ++;
          lineCount = 0;
      }
      else{
          lineCount ++;
    }
  }
  avgWordLength = nonSpaceChars/wordCount;
  printf("%f\n", nonSpaceChars);
  printf("Your text has %d characters and %d lines.\nYour text has %f words, with an average length of %3.2f ", numChars, numLines, wordCount, avgWordLength);
}
0
Peter Song
#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);    
}
0
Touseef Hashmi