2017-01-16 91 views
1

我寫了下面的函數來在輸入時動態分配輸入字符串,而不詢問用戶有多少字符。輸入字符串的動態分配

#include<stdio.h> 
#include<stdlib.h> 

char* dyninp (char str[], int *n) { 
    char ch; 
    int i = 0; 
    do { 
    ch = getchar(); 
    str = (char *) realloc(str, (i+1)*sizeof(char)); 
    str[i] = ch; 
    i++; 
    } while (ch != '\n'); 

    /*substitute '\n' with '\0'*/ 
    str[i-1] = '\0'; 

    if (n != NULL) { 
    /*i contains the total lenght, including '\0'*/ 
    *n = i-1; 
    } 

    /*because realloc changes array's address*/ 
    return str; 
} 

/*it is called in this way: 
char *a; 
int n; 
a = dyninp (a, &n); 
*/ 

此代碼的工作,但我有一些關於它的問題:

  1. 爲什麼它的工作?
    我不明白爲什麼,當我執行它時,我也可以在按下回車鍵之前刪除字符。 getchar()函數在每次迭代中只讀取一個字符,並將其寫入數組,所以如何刪除一些字符?
    如果getchar()在收到'\ 127'時刪除前一個字符,則該循環應該繼續執行,與其他任何字符一樣。但是這不會發生,因爲當循環結束時,「i」總是包含元素的確切數量。

  2. 我的代碼是否有效?如果不是,我如何才能讓它變得更好(即使使用內置函數)?

回答

1
  1. 除非將終端設置爲「原始」模式,否則在按回車鍵之前操作系統不會將輸入用於應用程序。輸入編輯由操作系統處理。當您撥打getchar()時,它會從此輸入緩衝區中讀取一個字符,而不是直接從終端讀取。

  2. 有一個POSIX功能getline()做同樣的事情。

1

回答了第一個問題:

這樣做的原因可能是緩衝在終端驅動程序。在備註部分提供了一個簡短的說明heregetchar()函數在接收到整個字符串並逐字符返回時,直到用戶在終端中提交一行時纔會收到任何輸入。因此,刪除是您終端的一項功能,而不是您的程序。

相關問題