2015-05-28 81 views
1

我學習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. 創建兩個文件指針祕密和公共。
  3. 從標準
  4. 在while循環
    1. 如果輸入是空的(null或換行),退出循環讀取輸入。
    2. 如果輸入包含短語「祕密」,則將該行放入祕密文件中。
    3. 其他把它公開的文件。

的問題是代碼的一部分來檢查輸入爲空是行不通的。該程序不會在空輸入(即換行符)上退出。什麼是正確的代碼?

順便說一句我讀How to check if stdin is empty in C但我什麼都不懂。

+4

檢查文檔STRCMP ... –

+1

我'scanf'不反正接受一個空行。即使這樣做,它也不會包含'newline'。我建議'如果(stricmp(message,「q」))' –

回答

2

一個空行,只進不出,應該結束這種循環

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

這個答案很棒。沒有想到這種方式。 –

+0

'%* c'究竟做了什麼?'我想這意味着「任意數量的字符,但至少有1個」。我對嗎? –

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