如何检查来自标准输入的输入是否为空或换行符

How to check if input from stdin is null or newline

正在学习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. 从标准输入读取输入
  4. 在一个while循环中
    1. 如果输入为空(null 或换行符),退出循环。
    2. 如果输入包含短语"secret",将行放入机密文件。
    3. 否则将其放入 public 文件。

问题是检查输入是否为空的代码部分不起作用。该程序不会在空输入(即换行符)时退出。正确的代码是什么?

顺便说一句,我读了How to check if stdin is empty in C,但我什么都不懂。

您可以使用 fgets 而不是 scanf 来读取字符串。 fgets 不仅可以防止缓冲区溢出,还可以让您使用前导 \n 字符来测试空行。

while( fgets(message, sizeof message, stdin))
...    
  if( message[0] == '\n' ) break; /* Step 4.1 */
  str[ strlen(str) - 1 ] = '[=10=]';  /* remove the newline before sending to the file */

Working example

一个空行,只输入,应该结束这个循环

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