如何检查stdin的输入是否为null或换行符

时间:2015-05-28 07:44:57

标签: c string stdin

我正在学习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;
}

该计划预计会这样做

  1. 从命令行接受两个参数,这两个参数是两个文件的名称
  2. 使用指针secret和public创建两个文件。
  3. 从stdin
  4. 读取输入
  5. 在while循环中
    1. 如果输入为空(null或换行符),则退出循环。
    2. 如果输入包含短语“secret”,则将该行放入密码文件。
    3. 将其放入公共档案。
  6. 问题是检查输入是否为空的代码部分不起作用。程序不会在空输入(即换行符)上退出。什么是正确的代码?

    BTW我读过How to check if stdin is empty in C,但我什么都不懂。

2 个答案:

答案 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 */

Working example

答案 1 :(得分:2)

空行,仅输入,应结束此循环

while(scanf("%99[^\n]%*c",message)==1)
{
    if(strstr(message,"secret"))
        fprintf(secret,"%s\n",message);
    else
        fprintf(public,"%s\n",message);
}