簡體   English   中英

使用 scanf() 讀取多行輸入

[英]Reading multiple lines of input with scanf()

相關代碼片段:

char input [1024];

printf("Enter text. Press enter on blank line to exit.\n");
scanf("%[^\n]", input);

這將讀取整行,直到用戶點擊 [enter],防止用戶輸入第二行(如果他們願意)。

要退出,他們按 [enter],然后再次按 [enter]。 因此,我嘗試了各種 while 循環、for 循環和涉及新行轉義序列的 scanf() 周圍的 if 語句,但似乎沒有任何效果。

有任何想法嗎?

嘗試這個:

while (1 == scanf("%[^\n]%*c", input)) { /* process input */ }

正如尚未指出的那樣, fgets()在這里比scanf()更好。

您可以使用fgets(input, 1024, stdin);讀取整行
其中stdin是與標准輸入(鍵盤)關聯的文件。
函數fgets()從鍵盤讀取每個字符,直到第一個換行符:'\n'(當然是在按ENTER鍵后獲得的......)。
重要提示:字符 '\n' 將成為數組input的一部分。

現在,您的下一步是驗證數組中的所有字符是否輸入
從第一個到'\n',都是空白。
另外,請注意輸入中第一個'\n'之后的所有字符都是垃圾,所以你不必檢查它們。

你的程序可能如下:

char input[1024];
printf("Enter text. Press enter on blank line to exit.\n");
while (1) {
   if (fgets(input, 1024, stdin) == NULL)
     printf("Input Error...\n");
   else {
     /* Here we suppose the fgets() has reached a '\n' character... */
     for (char* s = input; (*s != '\n') && isspace(*s); s++)
        ; /* skipping blanks */
     if (*s == '\n')
        break; /* Blank line */
     else
        printf("%s\n", input); /* The input was not a blank line */
   }
}

該代碼必須寫在您的main()塊內,並且,
更重要的是,必須首先包含頭文件<ctype.h>
因為使用了isspace()函數。
代碼很簡單:while永遠執行,用戶在每次迭代中輸入一行, if語句檢查是否發生了錯誤。
如果一切正常,則執行for(;;)語句,該語句探索數組輸入以觀察那里是否只有空白……或沒有。
for迭代一直持續到找到第一個換行符 '\n',或者出現一個非空白字符。
for終止時,這意味着保存在*s中的最后一個分析字符是換行符(意味着所有早期字符都是空白),或者不是(意味着至少在input[]中有一些非空白字符,所以輸入是普通文本)。

“ethernal” while(1)只有在讀取空行的情況下才會被打破(參見第 11 行的break語句)。

OP 說“要退出,他們點擊 [enter] 然后再次 [enter]”

unsigned ConsecutiveEnterCount = 0;
for (;;) {
  char buffer[1024];
  if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
    break;  // handle error or EOF
  }
  if (buffer[0] == '\n') {
    ConsecutiveEnterCount++;
    if (ConsecutiveEnterCount >= 2 /* or 1, not clear on OP intent */) {
      break;
    }
  }
  else ConsecutiveEnterCount = 0;
  // Do stuff with buffer;
}
#include <stdio.h>
int main(){
    char arr[40];
    int i;
    for( i = 0; i < sizeof(arr); i +=2 ){
        scanf("%c%c",&arr[i],&arr[i+1]);
        if( arr[i] == '\n' && arr[i+1] == '\n' )
            break;
    }
    printf("%s", arr);
    return 0;    
}

...我嘗試了各種 while 循環、for 循環和涉及新行轉義序列的 scanf() 周圍的 if 語句,但似乎沒有任何效果。

閱讀之前,您似乎嘗試了所有不應該嘗試的東西! AC 程序員應該閱讀手冊以免他們遇到未定義的行為,這會導致像您所經歷的那樣令人頭疼的行為。 詳細地說,你不能像學習 Java 一樣通過猜測來學習 C。

把這當作你的教訓。 停止猜測開始閱讀fscanf手冊)

根據該手冊:

[匹配一組預期字節(掃描集)中的非空字節序列。

重點是我的。 您似乎在描述的是一個的字節序列,這意味着匹配失敗 手冊對匹配失敗有什么說法?

成功完成后,這些函數將返回成功匹配和分配的輸入項的數量 如果發生早期匹配失敗,此數字可以為零 如果輸入在第一次轉換(如果有)完成之前結束,並且沒有發生匹配失敗,則應返回 EOF。 如果在第一次轉換(如果有)完成之前發生錯誤,並且沒有發生匹配失敗,則應返回 EOF...

同樣,重點是我的……這告訴您,與大多數其他 C 標准函數一樣,您需要檢查返回值 例如,當您調用fopen時,您會按照if (fp == NULL) { /* handle error */ }的行編寫一些習語。

你的錯誤處理在哪里? 請注意,返回值不僅僅是二進制選擇 在執行n次轉換的情況下,有n+2可能的返回值,范圍為: EOF , 0 .. n 在嘗試使用fscanf之前,您應該了解每一個的含義。

當您想從下一行讀取輸入時,您可以使用以下函數。

scanf("%d \n",&a);
scanf("%d \n",&b);
scanf("%d ",&c);

如果您從命令行提供輸入,則在換行后將接受另一個輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM