计算输入一个单词的次数

时间:2012-12-11 15:20:02

标签: c

经过多次尝试使我的计划工作后,我转向你们。我想创建一个计算特定单词输入次数的程序。该特定单词已被指定为参数,我试图通过使用argc和argv来回忆它。然后我希望程序计算我输入单词的次数并完成我希望能够键入#EOF以便它停止并显示结果。这是我到目前为止一直在尝试的。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main(int argc, char *argv[])
{

int i=0;
char buf[1026]={'\0'};
char *p="#EOF\n";
fgets(buf, sizeof buf, stdin);

while((strcmp(buf, p) !=0) && (fgets(buf, sizeof buf, stdin) != NULL ))
{

   if(strncmp(buf, argv[1], strlen(argv[1])) == 0)
    {
        i++;
    }
}
printf("%d", i);

return 0;
}

我根本没有任何错误,但也没有真正发生任何事情。我确实尝试检查故障的位置,并且我发现当我尝试在if语句中显示I的值时,它的计数速度非常快!

提前致谢!

3 个答案:

答案 0 :(得分:1)

嗯,第一个问题是argv [0]是你程序的名字;你的参数从argv [1]开始。

此外,在将任何内容放入buf之前,正在调用while循环。您肯定需要使用不同的循环或在事先初始化buf以确保循环正常运行。

另外,我建议您确切知道应该和不应该匹配的内容。您正在根据要搜索的单词的长度进行子字符串比较(strncmp),但这是您想要的吗?这将在子字符串中得到单词,但你想要那个,还是整个单词?此外,用户只需在每行输入一个单词或可能出现单词的句子吗?案例很重要吗?

答案 1 :(得分:0)

你的循环应该是:

while( fgets(buf, sizeof buf, stdin) != NULL )
{
}

在<{em> fgets() 之前检查缓冲区是非空是没有意义的。

请注意,fgets()将包含换行符,请参阅the documentation。另请注意使用sizeof以避免在代码中使用魔法数字。

如果您希望用户真正键入 #EOF 结束,而不是通过“发送”文件结束信号来结束输入( Ctrl + < Linux中的kbd> D ,Windows中的 Ctrl + Z )这将起作用并导致循环退出,你当然要比较之前计数行中的单词。

答案 2 :(得分:0)

你有一个无限循环。

fgets(buf, 1025, stdin);

在上面一行代码中,fgets()将从stdin一串字符 包含换行符 并将其存储到{ {1}}。

一个简单的解决方法是将换行符添加到您检查的字符串中:

buf

其他问题:

1)

char *p="#EOF\n";

2)因为您使用了char buf[1026]; // This should be initialized to an empty string when you start // char buf[1026] = {'\0'}; would do it char *p="#EOF"; while(strcmp(buf, p) !=0) 循环,并且在获取任何输入之前进行了检查,所以您始终至少输入一次。这可能不是你想要做的。一个while() / do循环,或者作为第一步抓取输入会更好。

3)while这是检查你的程序名称,如果你想检查你想要的第一个命令行参数if(strncmp(buf, argv[0],

4)如果您正在尝试检查第一个命令行参数是否与用户输入的内容相同,则需要这样:

argv[1]

我的代码版本正在运行:

if(strncmp(buf, argv[1], strlen(argv[1])) == 0)