Как лучше всего считать слова в Си? - PullRequest
0 голосов
/ 10 июля 2009

Вот простая программа для подсчета слов, которая мне кажется очень эффективной. Это лучший способ считать слова в Си, или в этой программе есть недостатки?

         #include <stdio.h>
         int CountWords(void);
         main()
         {
            printf("count the words and enter string\n");
            CountWords();

         }
        int CountWords(void)
        {
            char c;
            int num=0;
            int flag= 0;
             while((c=getchar())!='\n')
            {
              if(c==' ')
              {
                flag=0 ;        
              }                         
              else if(flag==0)
              {
                num++;
                flag=1;     
              }                      
           }
              printf("Num is %d",num);
         }     

Ответы [ 7 ]

2 голосов
/ 10 июля 2009

Ваш счетчик будет выключен одним с этой программой. Это потому, что вы проверяете место для добавления одного к вашему количеству слов. Как вы думаете, что произойдет с последним словом в строке?

1 голос
/ 10 июля 2009

Одна вещь, о которой я могу думать, это то, что она будет считать знаки препинания как слова, если они окружены пробелами.

* 1003 Е.Г. *

The quick - and lazy - fox.

будет содержать 7 слов, хотя их всего 5.
Возможно, вы захотите сократить набор символов слова только до буквенно-цифровых символов и считать знаки препинания как разделители слов - если это не 'или a - в середине слова, в зависимости от того, что вы определяете как слово (являются это и сообразительные отдельные слова? Два слова каждое?).

0 голосов
/ 22 декабря 2011
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define SIZE 100

int main()
{
 char str[SIZE]={ '\0' };
 int string_size;
 int wordcount, found=0, other=0;

 printf("Enter the string:");
 fgets(str, SIZE, stdin);

 string_size = strlen(str);

 for(int i=0;i<=string_size;i++)
 {
  if(isalnum(str[i]) && !isalnum(str[i-1]))
    found++;
 }

 printf("Number of words are:%d\n", found);
 return 0;
}
0 голосов
/ 21 сентября 2011

бах. Слишком много кода:

int numwords(char *str)
{   int n = 0;
    for(str=strtok(str, " -.!,;"); str; str=strtok(NULL, " -.!,;"))
        n++;
    return n;
}

- явный способ считать слова в с. libc strtok() высоко оптимизирован.

0 голосов
/ 11 октября 2010

Вот полный фрагмент кода, который может улучшить эту программу и который работает в любых условиях:

  #include <stdio.h>
         void CountWords(void);
         void main()
         {
            printf("\n\tcount the words and enter string\n\n\n");
            CountWords();

         }
        void CountWords(void)
        {
            char c;
            int num=0;
            int flag= 0;
             while((c=getchar())!='\n')
            {
            if((c==' ')||(c=='  ')||(c=='.')||(c==';')||(c==',')||(c==';')
                ||(c==':')||(c=='"')||(c=='?')||(c=='!')||(c=='-'))
              {
                flag=0 ;        
              }                         
              else if(flag==0)
              {
                num++;
                flag=1;     
              }

           }
              printf("\t\n\n\nNumber of words is %d\n",num);
         }

/*By Md. azaz*/
0 голосов
/ 10 июля 2009

Сначала определите вашу проблему с помощью алгоритма. Например, сделайте блок-схему. Проведите несколько быстрых примеров в своей логике, как это сделали другие постеры. Сделайте все это , прежде чем писать код .

Затем, если вы думаете, что у вас есть лучший алгоритм, напишите это на C.

Придумайте список вопросов, которые нужно задать себе, например: «Что такое слово?», «Что не слово?».

Для анализа текста или токенов любого рода вам может быть интересно выразить свои идеи в виде формы Бэкуса-Наура . Взгляните на любые спецификации компьютерных языков и обратите внимание, как они определяют что-то вроде идентификатора. Даже если вы не используете это для написания своей программы, это должно помочь вам разобраться в проблеме.

Ограничены ли слова буквенными символами a-z и A-Z? Как насчет переносимых слов?

Возможно (не в официальной БНФ):

дефис: = '-'
альфа: = 'а' | 'б' | ... | 'z' | 'A' | 'B' | ... | 'Z'
альфа-группа: = альфа | альфа-группа
дефис: = альфа-группа дефис альфа-группа | альфа-группа дефис дефис
слово: = альфа-группа | дефис

0 голосов
/ 10 июля 2009

Инициализируйте flag=1 и отключение на одну ошибку должно исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...