我正在尝试编写一个简单的C程序来输出单词的长度并输出它们的频率。例如,如果用户输入"嘿"我的程序将输出字长:3次出现1,依此类推输入更大的字符串。我似乎无法正确循环它。我想在设置分隔符时设置两个计数器,既可以计算当时单词的长度又可以计算单词的长度,但我还没有找到工作方式。我该如何修复循环?我的代码如下。我很感激任何帮助。我应该包括我的程序只能正确输入一个单词而不是整个句子或多个句子。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
const char delim[] = ", . - !*()&^%$#@<> ? []{}\\ / \"";
const int n_delim = 31;
#define SIZE 1000
int is_delim(int c);
int main(){
char string[SIZE];
int wordlength = 0, wl[SIZE];
int word = 0, i;
printf("Enter your input string:");
fgets(string, SIZE, stdin);
string[strlen(string) - 1] = '\0';
printf("Word Length\tCount\n");
int seen = 0;
int l;
for (i = 0; i < strlen(string); i++){
if (is_delim(string[i])){
wl[word++] = wordlength;
l = wordlength;
seen++;
printf("%d\t\t%d\n", l, seen);
wordlength = 0;
}
wordlength++;
}
return 0;
}
int is_delim(int c){
register int i;
for (i = 0; i < n_delim; i++)
if (c == delim[i]) return 1;
return 0;
}
答案 0 :(得分:1)
诀窍是wl [n]保存了单词的数量 长度n。此外,您不需要继续调用strlen() 在每次迭代时,只需检查最后的零字节。 如果启用它,优化器将为您执行此操作。 奇怪的(; 1;)是循环计数的 最后一个字,由零字节终止。
memset(wl,0,sizeof(wl));
for(wordStart=maxLength=i=0;1;i++) {
if(is_delim(string[i]) || string[i]==0) {
int wordLength= i-wordStart;
if(wordLength>0)
wl[wordLength]++;
if(wordLength>maxLength)
maxLength= wordLength;
wordStart= i+1;
}
if(string[i]==0)
break;
}
for(i=1;i<=maxLength;i++) {
if(wl[i]>0) {
printf("%d words of length %d.\n",wl[i],i);
}
}
答案 1 :(得分:0)
你真的应该使用strtok
。现在,你永远不会将最后一个字符串与当前字符串进行比较,因此你无法区分它们。您可以使用strcmp
。最后,您应该使用strlen
而不是手动测试字符串的长度。这是你的循环看起来像
int seen = 0;
pch = strtok(string, delim);
last = pch;
while(pch != NULL) {
if(strcmp(last, pch) != 0) {
printf("%s:\t%d\t\t%d\n", last, (int)strlen(last), seen);
seen = 1;
}else {
seen++;
}
last = pch;
pch = strtok(NULL, delim);
}
printf("%s:\t%d\t\t%d\n", last, (int)strlen(last), seen);
注意,您应该在循环之前将变量seen
设置为0.