2015-10-21 46 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函数,该函数完全符合您的需求:它将给定的字符串拆分为多个令牌。

相关问题