#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的值时,它的计数速度非常快!
提前致谢!
答案 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)