2

经过无数次尝试使我的程序正常工作后,我求助于你们。我想制作一个程序来计算输入特定单词的次数。该特定单词已被指定为参数,我试图通过使用 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 的值时,它的计数非常非常非常快!

提前致谢!

4

3 回答 3

1

好吧,第一个问题是 argv[0] 是您的程序的名称;您的参数从 argv[1] 开始。

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

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

于 2012-12-11T15:21:42.330 回答
0

你的循环应该是:

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

fgets(). _ _

请注意,fgets()将包括换行符,请参阅文档。还要注意使用sizeof以避免在代码中使用神奇的数字。

如果您希望用户真正键入#EOF结束,而不是通过“发送”文件结束信号(Linux 中的Ctrl+ ,Windows 中的+ )来结束输入,这将起作用并导致循环退出,你 msut当然在计算该行中的单词之前与那个进行比较。DCtrlZ

于 2012-12-11T15:25:02.940 回答
0

你有一个无限循环。

fgets(buf, 1025, stdin);

在上面的代码行中,fgets()将从包括换行符在内的stdin字符串中取出并将其存储到.buf

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

char *p="#EOF\n";

其他问题:

1)

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) 

2)因为您使用了while()循环,并且您在获得任何输入之前进行检查,所以您将始终至少输入一次。这可能不是您想要做的。A do/while循环,或者作为第一步抓取输入会更好。

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

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

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

我正在运行的代码版本:

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

    int i=0;
    char buf[1026]={'\0'};
    char *p="#EOF\n";
    do
    {
       fgets(buf, 1025, stdin);
       if(strncmp(buf, argv[1], strlen(argv[1])) == 0)
            i++;
    } while (strcmp(buf, p) != 0);
    printf("%d\n", i);
    return 0;
}
于 2012-12-11T15:25:59.427 回答