您如何使用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;
}
答案 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;
}
每次c
与delim
匹配时,此函数将返回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
,并在每次迭代时增加长度。
您需要想出一种方法,既不会因为双分隔符而插入零长度值,也不会在打印结果时忽略它们。