2015-10-21 60 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; 
} 

該功能將在每次可以delim匹配c時間返回1。所以你可以這樣使用它:

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'數組,保持字數和字由'delim'數組決定_delimited_。 'is_delim'函數檢查當前字符是否爲分隔符,如果是則返回1,並將'length'變量存儲在'wl'數組中。字數的變量保持軌道是「字」,每當我們添加一個新字時,我們就增加它。 –

0

基本上你想根據一些分隔符將字符串拆分成單詞,並計算它們的長度。 C標準庫提供strtok函數,該函數完全符合您的需求:它將給定的字符串拆分爲多個令牌。

相關問題