2015-10-21 4 views
0

Как бы вы могли подсчитать длину слов и вывести их вхождения из строки с помощью gets() или fgets()? Например, здесь используется код, но с использованием getchar() ниже. Я думаю, что записать его в gets() упростит включение всех разделителей в программу, вместо того, чтобы вручную установить, будут ли утверждения для каждого из них это не так?C Программирование: подсчет длины слов в строке

#include <string.h> 
#include <ctype.h> 
const char delim[] = ", . - !*()&^%$#@<> ? []{}\\/\""; 
#define SIZE 100 

int main(void){ 
    int length[SIZE] = { 0 }; 
    int name[SIZE]; 
    int i = 0, ch, word_len = 0; 
    int count = 0; 

    printf("enter sentence: "); 

    while (1){ 
     ch = getchar(); 
      if (isalpha(ch)){ 
      ++word_len; 
     } 
     else if (ch == ' ' || ch == '.'){ 
      if (word_len) 
       length[word_len - 1]++;//-1: to 0 origin 
      if (ch == '.') 
       break; 
      word_len = 0; 
     } 

    } 
    printf("Word Length \tCount \n"); 
    for (i = 0; i<sizeof(length)/sizeof(*length); ++i){ 
    if (length[i]) 
      printf(" %d \t\t%d\n", i + 1, length[i]); 
    } 
    return 0; 
} 
+0

'else if (strchr (delim, ch)) {' может удовлетворить потребность. (вместо 'else if (ch == '' || ch == '.') {') – chux

ответ

0

Вы можете создать свою собственную функцию обнаружения ограничителя.

// globals 
const char *delim = " .,;:!?\n\0"; 
const int n_delim = 9; 

int is_delim(int c) 
{ 
    register int i; 
    for (i = 0; i < n_delim; i++) 
     if (c == delim[i]) return 1; 
    return 0; 
} 

Эта функция возвращает 1 каждый раз, когда он может соответствовать c с delim. Таким образом, вы можете использовать его как это:

fgets(buffer, 200, stdin); 

for (i = 0; i < strlen(buffer); i++) { 
    if (is_delim(buffer[i])) { 
     wl[words++] = length; 
     length = 0; 
     continue; 
    } 
    length++; 
} 

Я предполагаю, что вы знакомы с fgets function.

Вы в основном будете проходить через свой буфер, делая сравнения с каждым персонажем. Каждая итерация цикла вы проверяете, является ли текущий символ разделителем слов, если он есть, вы сохраняете текущий length и устанавливаете length=0 для нового слова, и на каждой итерации вы увеличиваете длину.

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

+0

Спасибо, что ответили enzo! Я как бы застрял. Таким образом, длина отслеживает длины слов, но какая переменная хранит количество видов длины? Это слова? – Omar

+0

О, подожди, нам нужно другое утверждение if для этого правильно? – Omar

+0

@Omar Что вы подразумеваете под типами длин? 'wl' - это массив' int', содержащий количество слов, а слова _delimited_ массивом 'delim'. Функция 'is_delim' проверяет, является ли текущий символ разделителем, если он возвращает 1, и мы сохраняем переменную' length' в массиве 'wl'. Переменная, отслеживающая количество слов, является 'words', и мы увеличиваем ее каждый раз, когда добавляем новое слово. –

0

В принципе, вы хотите разбить строку на слова, основанные на некоторых разделителях, и вычислить их длину. Стандартная библиотека C предоставляет функцию strtok, которая делает именно то, что вам нужно: она разделяет данную строку на несколько токенов.

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