C编程:计算字符串中出现的字长

时间:2015-10-21 00:10:28

标签: c string loops

您如何使用gets()fgets()计算字长并从字符串中输出其出现次数?例如,下面是使用getchar()的代码。我认为在gets()中编写它可以更容易地将所有分隔符合并到程序中,而不是必须手动设置if中的每一个的if语句吗?

#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;
 }

2 个答案:

答案 0 :(得分:0)

基本上,您希望根据某些分隔符将字符串拆分为单词,并计算其长度。 C标准库提供strtok函数,它完全符合您的需要:它将给定的字符串拆分为多个标记。

答案 1 :(得分: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;
}

每次cdelim匹配时,此函数将返回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,并在每次迭代时增加长度。

您需要想出一种方法,既不会因为双分隔符而插入零长度值,也不会在打印结果时忽略它们。