2016-04-27 3 views
0

Я работал над программой на C, чтобы подсчитать количество пробелов в предложении. Но мне не удалось заставить его работать правильно. Если я ввожу что-то вроде Привет мир 1234, как вы выход я получаю 3, когда выход ожидается 5.
Мой код:Код не работает, как ожидалось, в C

//Program to count number of words in a given Sentence 
#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char sent[100]; 
    char sentence[] = {' ', '\0'}; 
    printf("\nEnter a sentence :\n"); 
    gets(sent); 
    strcat(sentence, sent); 
    int l = strlen(sentence), i = 0, count = 0, countCh = 0; 
    printf("%d", l); 
    char ch, ch1; 
    for (i = 0; i < (l-1); i++) 
    { 
     ch = sentence[i]; 
     if (ch == ' ') 
     { 
      ch1 = sentence[i+1]; 
      if (((ch1 >= 'A') && (ch1 <= 'Z'))||((ch1 >= 'a') && (ch1 <= 'z'))) 
       count++; 
     } 
    } 
    printf("\nNo of words is : %d", count); 
    return 0; 
} 

Я использовал ту же логику в Java, и это работал отлично. Может ли кто-нибудь объяснить, что происходит не так?

+2

Почему 'java' ?????? –

+2

никогда не используйте 'gets()', вместо этого используйте 'fgets()'. –

+0

'strcat (предложение, отправлено);' Can not it. потому что «предложение» не является дополнительным пространством. Например, 'char sentence [102] = {'', '\ 0'};' – BLUEPIXY

ответ

5

Проблема в коде совпадает с определением sentence. Когда вы не учитываете размер массива и инициализируете его, размер массива будет определяться длиной инициализатора.

Цитируя man page из strcat()

strcat() функции добавляет src строку в dest строку, переписав завершающий нулевой байт («\ 0») в конце dest, а затем добавляет завершающий нуль байт. Строки могут не перекрываться, и строка dest должна иметь достаточно места для результата. Если dest недостаточно велико, поведение программы непредсказуемо;

То есть программа будет вызывать undefined behavior.

Таким образом, sentence имеет, конечно, путь меньше памяти, чем он должен был удерживать. Кроме того, strcat() совсем нет есть.

правильный способ сделать это будет

  • Определение sentence с надлежащим Dimention, как char sentence[MAXSIZE] = {0};MAXSIZE, где будет MACRO, имеющий размер вашего выбора.
  • использовать fgets(), чтобы прочитать ввод пользователя.
  • isspace() (from ctype.h) в цикле, чтобы проверить наличие пробела во входной строке.
+0

@SouvikSaha что? Вы сказали, что хотите подсчитать количество пробелов, теперь вы говорите, что этого недостаточно, какова ваша цель? –

0

Следующая

 if (((ch1 >= 'A') && (ch1 <= 'Z'))||((ch1 >= 'a') && (ch1 <= 'z'))) 
      count++; 

, вероятно, должен быть

 if (ch1 != ' ') 
      count++; 

В настоящее время "12345" не будет считаться словом.

count также подсчитывает пробелы, поэтому количество слов еще одна: отсюда 3 вместо 5.

Ваш sentence, кажется, имел намерение подсчетом terminatin NUL.

Если вы хотите посчитать реальные слова, содержащие буквы, используйте состояние bool, отличаются ли текущие и предшествующие состояния существа буквой.

Как указано, переполнение возможно с кодом.

Смежные вопросы