2017-01-09 249 views
-1

當字符串在單詞之間包含空格時,從C中鍵盤讀取字符串的最準確方法是什麼?當我爲此使用scanf時,它不會讀取帶空格的字符串。第二種選擇是使用gets,但它應該是有害的(我也想知道爲什麼?)。另一個是我不想要使用任何文件處理概念,如fgets。如何讀取C語言中包含空格的字符串

+2

字符串如何輸入系統?由用戶?從一個文件?從TTY?在套接字上?這太寬了...... – RedX

+0

用戶通過鍵盤 –

+3

你可能想'fgets'。 –

回答

2

@ user3623265,

請找到它使用與fgets讀取從標準輸入字符串的示例程序。

請參閱一些示例C文檔,瞭解fgets如何用於從鍵盤獲取字符串以及stdin的用途。

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
char str[80]; 
int i; 
printf("Enter a string: "); 
fgets(str, sizeof(str), stdin); 

i = strlen(str) - 1; 
if (str[i] == '\n') 
    str[i] = '\0'; 

printf("This is your string: %s", str); 
return 0; 
} 
+1

如果我*立即*按提示上的^^D會發生什麼情況? (我在一個類似Linux的系統上,所以「你得到一個包含'^ D'的字符串不是一個有效的答案。) – usr2564301

+0

我給了他一個基本的例子,就如何從鍵盤讀取而不是使用scanf()並獲得功能。基本上有多種方法可以避免顯示EOF(Ctrl + D)。問的問題是關於使用scanf()或獲取或其他函數的有效性。因此,出於這兩個我的意見/我喜歡fgets()。如果我所表達/解釋的是錯誤的,那麼請糾正我,因爲我願意在這裏學習。這就是我加入這個社區的原因。 –

+2

我提到它是因爲它會導致長度爲** 0的輸入字符串,'strlen(str)-1'會嘗試訪問不允許的內存。你應該總是檢查'fgets'的返回結果,它*特別*檢查[沒有輸入字符的輸入結束](https://linux.die.net/man/3/fgets)。 – usr2564301

3

這2種方式來讀取包含不使用getsfgets

空格的字符串
  • 您可以使用getline(2008 POSIX可能不存在您的系統),可以方便地管理足夠大小的緩衝區分配以捕捉整條線路。

    char *line = NULL; 
    size_t bufsize = 0; 
    size_t n_read; // number of characters read including delimiter 
    while ((n_read = getline(&line, &bufsize, stdin)) > 1 && line != NULL) { 
        // do something with line 
    } 
    
  • 如果你絕對要scanf,在這個例子中讀取到行結束,除非行比指定的字符數減去1的分隔符更多。在後一種情況下,該行會被截斷,您將在下一個scanf調用中獲得剩餘的字符。

    char line[1024]; 
    while (scanf("%1023[^\n]\n", line) == 1) { 
        // do something with line 
    } 
    
  • 我還要指出的是,當你從鍵盤scanf例如讀取字符串時,實際上是從文件中讀取與文件指針stdin。所以你真的不能避免「任何文件處理概念」

    +0

    大小格式不包括終止空字節格式中的數字應該是1023. –

    +0

    感謝您指出這@JonathanLeffler –

    0

    如果你堅持沒有FILE *範圍,使用getchar()。

    char buff[1024]; 
        int ch; 
        int i = 0; 
    
        while((ch = getchar()) != '\n') 
        if(i < 1023) 
         buff[i++] = ch; 
        buff[i] = 0; 
    
        /* now move string into a smaller buffer */ 
    

    通常情況下,stdout和stdin以及FILE *都可用。你的需求有點奇怪,因爲你顯然不是一個高級C程序員,他有一個不尋常的需要壓制FILE *符號,我懷疑你對C IO的理解是不穩定的。

    1

    還有第三個選項,您可以用read()通話讀取stdin原始數據:

    #include <unistd.h> 
    
    int main(void) { 
        char buf[1024]; 
        ssize_t n_bytes_read; 
    
        n_bytes_read = read(STDIN_FILENO, buf, sizeof(buf) - 1); 
        if (n_bytes_read < 0) { 
         // error occured 
        } 
        buf[n_bytes_read] = '\0'; // terminte string 
    
        printf("\'%s\'", buf); 
    
        return 0; 
    } 
    

    請不是每個輸入被複制到原料包括buf尾隨回報。也就是說,如果你輸入Hello World你會得到

    'Hello World 
    ' 
    

    作爲輸出。嘗試online

    相關問題