2017-04-13 54 views
-1
 #include <stdio.h> 

    int main(){ 
      char phrase [100]={0}; 
      printf("Write a sentence: \n"); 
      scanf ("%s", phrase); 
      printf("%s\n", phrase); 
     } 

該程序的目的是打印用戶的句子。問題是這個角色出了問題,我不知道如何解決它。如何從字符串打印空白空間?

在執行過程中,由於某種原因,該句子僅在第一個空白處打印。但爲什麼?

+2

這是scanf'如何'工作,用'fgets'獲得whoe行 – fghj

+0

讀([scanf函數的%S的一部分] http://en.cppreference.com/w/ c/io/fscanf) – BLUEPIXY

+0

除非您指定目標緩衝區長度,否則'scanf'是不安全的 - 請考慮如果用戶輸入101個或更多字符會發生什麼情況。 – Dai

回答

0

正如評論中指出的,scanf中的%s轉換說明符無法讀取帶有空格的字符串;它使用空格作爲分隔符。您可以使用fgets

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

int main() { 
    char aLine[100]; 
    fgets(aLine, 100, stdin); 
    aLine[strlen(aLine)-1] = '\0'; // trimming the last \n 
    printf("%s\n", aLine); 
    return 0; 
} 
+3

「_scanf無法讀取帶有空格的字符串,它使用空格作爲分隔符_」 - 不。您可以。 'scanf(「%[^ \ n]」,string);的scanf( 「%* C」);'。 '%s'使用空格作爲分隔符,而不是'scanf'作爲一個整體 –

+1

請注意,如果您的代碼遇到EOF,那麼您有一個未初始化的緩衝區,並且您不知道該字符串有多長。如果緩衝區爲空 - 第一個字符爲空字節 - 則在數組開始之前寫入字符,這是未定義的行爲。 –