我正在学习c并编写了这段代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
char message[100];
FILE *secret=fopen(argv[1],"w");
FILE *public=fopen(argv[2],"w");
while(scanf("%99s\n",message)==1)
{
if (strcmp(message,"\n")) //this does not work as expected
break;
if(strstr(message,"secret"))
fprintf(secret,"%s\n",message);
else
fprintf(public,"%s\n",message);
}
return 0;
}
该计划预计会这样做
问题是检查输入是否为空的代码部分不起作用。程序不会在空输入(即换行符)上退出。什么是正确的代码?
BTW我读过How to check if stdin is empty in C,但我什么都不懂。
答案 0 :(得分:2)
您可以使用fgets
代替scanf
来读取字符串。 fgets
不仅可以防止缓冲区溢出,还可以为您提供前导\n
个字符来测试空行。
while( fgets(message, sizeof message, stdin))
...
if( message[0] == '\n' ) break; /* Step 4.1 */
str[ strlen(str) - 1 ] = '\0'; /* remove the newline before sending to the file */
答案 1 :(得分:2)
空行,仅输入,应结束此循环
while(scanf("%99[^\n]%*c",message)==1)
{
if(strstr(message,"secret"))
fprintf(secret,"%s\n",message);
else
fprintf(public,"%s\n",message);
}