2017-09-17 66 views
-2

我需要讀取一個字符串並完成它。例如:如何才能完成讀取字符串的程序?

INPUT

fxy yxf 
abc bac 
weq qew 
abg bga 
acd adc 
abt bta 
poeq eopq 
qwte wtqe 

我想單詞 「wtqe」 後完成程序。

這裏是我的代碼:

int main(){ 

    do { 

     scanf("%s %s", &str1, &str2); 

    }while(scanf("%c") != EOF); 
    return 0; 
} 
+2

你的程序有什麼問題?你有構建錯誤嗎?崩潰?意外的結果?請創建一個[最小,**完整**和可驗證示例](http://stackoverflow.com/help/mcve)向我們展示。 –

+0

問題是,DO-WHILE有一個「返回0」後,主要。但它並沒有結束,因爲它循環並且不會結束循環。 – Mushu

+0

爲什麼不測試'str2'如果它的值是'「wtqe」'? – flaviodesousa

回答

3

循環的結束是while(scanf("%c") != EOF)

這意味着,當你到達檔案結尾循環退出。

如果你把所有這些文件放在一個文本文件中,然後用這個文件作爲標準輸入(./prog < file)運行你的程序,那麼在完成讀取文件後它會退出。

如果你想輸入所有這些,你需要指出終端的文件結尾。在Linux,Mac和類似的系統上,你可以用ctrl + d來做到這一點;在Windows上,我認爲它是ctrl-z。


編輯添加:如果輸入的開頭不匹配,這會給出奇怪的結果。一個更好的選擇可能是

while (scanf("%s %s", &str1, &str2) == 2) { 
    // Do stuff 
} 

如通過user3121023's answer,這也可能會導致緩衝區溢出問題,你應該給一個明確的大小%s

+0

@DavidBowling好點;我更習慣於C++,並在幾乎每種語言中都獲得I/O錯誤的細節。我已經更新了我的答案,但如果您想區分單個字符串和沒有字符串,還有更好的選擇。 –

+0

@ user3121023噢,我認爲它消耗*尾隨*空白,而不是*領先*空白。我會再次編輯。謝謝。 –

3

使用fgets讀取一行和sscanf來解析這兩個字符串。如果輸入空白行或只有一個字符串的行,while循環將退出。

#include <stdio.h> 

int main (void) { 

    char line[999] = ""; 
    char str1[100] = ""; 
    char str2[100] = ""; 
    int result = 0; 

    do { 
     if (fgets (line, sizeof line, stdin)) { 
      result = sscanf (line, "%99s%99s", str1, str2); 
     } 
     else {//fgets failed 
      break; 
     } 
    } while (line[0] != '\n' && result == 2); 

    return 0; 
}