2017-03-26 107 views
5

在下面的代碼循環中,scanf("%[^\n]s",array)不起作用。它不會等待輸入並跳過。但%之前的空間解決了這個問題。爲什麼?%scanf中的[^ n] s不會等待輸入並被跳過

下面是錯誤的程序:

#include <string.h> 
#include <stdio.h> 

int main()  
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf("%[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

下面是正確的代碼:

#include <string.h> 
#include <stdio.h> 

int main() 
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf(" %[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

爲什麼它需要%前的空間,預期它的工作?

+0

這是因爲你有一個需要跳過的換行符。第一個scanf只是讀取數字,你仍然在輸入中留下換行符。並且循環中的scanfs不會在換行符中讀取,要麼沒有空間來吸收剩餘的換行符。實際上你可以在循環中使用scanf(「%s」,arr)。 – Shiping

+0

你可能想檢查一下:https://stackoverflow.com/questions/45038176/not-able-to-input-a-string-with-spaces-in-a-loop-in-c/45038767?noredirect= 1#comment77052162_45038767我最近回答 –

回答

1

使用此格式%[^\n],scanf()在閱讀換行符後停止。所以,在第一次輸入之後,剩下一個沒有消耗的換行符。 因此,後續的scanf()調用根本不讀取任何輸入。

%[^\n]的空間中,scanf()會忽略任何數量的空白字符。因此,scanf()忽略了剩餘的換行符。從scanf

的空白字符的序列(空格,製表,換行,等;見 isspace爲(3))。該指令與輸入中的任意數量的空白空間 (包括無)匹配。

順便說一下,在格式字符串的末尾不需要額外的s

使用fgets()這通常優於scanf()fgets()會在有空間的情況下將新行字符讀入緩衝區)。另見:Why does everyone say not to use scanf? What should I use instead?

+0

Thnxxx我現在明白了...真的很感謝 – ammasum

2

首先,尾隨s%[格式說明的部分,因此將其刪除,並讓談%[^\n]

現在,%[^\n]告訴scanf做的是掃描的一切,直到一個換行符('\n')或EOF,以先到者爲準,並將其存儲在其相應的參數,在這種情況下,arr

這裏是捕獲:%[^\n]如果要讀取的第一個字符是\n失敗。

'等待',你說。 '我沒有輸入一個單獨的輸入。那麼,它爲什麼會失敗?'。真正。你沒有。但請記住輸入您按下了上一行嗎?事實證明,前面的電話scanf抓住一切,直到\n,離開\n那裏並返回。因此,在循環的下一次迭代中,scanf看到這個\n字符以前調用遺留下來scanf,失敗並返回0。

至於空間,它是一個空白字符。scanf中的空格字符指示它掃描並放棄所有空白字符,直到第一個非空白字符。所以,它刪除了\n(因爲它是一個空格字符),並且scanf將等待進一步的輸入。