簡體   English   中英

在C中獲取字符串輸入的這兩種方法有什么區別?

[英]What is the difference between these two methods to get string input in C?

我正在學習C編程,我必須實現一個讀取未知大小的輸入字符串的程序。 我寫了這段代碼:

int main() {
    char *string;
    char c;
    int size = 1;

    string = (char*)malloc(sizeof(char));

    if (string == NULL) {
        printf("Error.\n");
        return -1;
    }
    printf("Enter a string:");
    while ((c = getchar()) != '\n') {
        *string = c;
        string = (char*)realloc(string, sizeof(char) * (size + 1));
        size++;
    }
    string[size - 1] = '\0';

    printf("Input string: %s\n", string);

    free(string);
    return 0;
}

但是最后一個printf沒有顯示整個字符串,只顯示最后一個字符。 所以如果我輸入hello, world上最后一個printf打印d

經過一番研究后,我嘗試了這段代碼,它的確有效! 但我並沒有與我的差別。

我希望自己清楚明白,謝謝你的關注。

在您的代碼版本中,您使用以下命令將新讀取的字符c分配給string

*string = c;

*string指向*string的開頭,因此您將繼續用新讀取的字符替換字符串的第一個字符。

您鏈接的代碼執行以下操作:

str[i] = c

基本上,它使用索引i將字符分配給字符串的末尾。

在您的代碼版本中,您可以使用size - 1而不是i

嘗試改變:

*string = c;

至:

string[size-1] = c;

這樣你就不會每次都覆蓋第一個字符。

您的代碼有幾個問題:

  • 將所有字符存儲到已分配內存的第一個字節中
  • 你將字符讀入char變量,你無法正確測試EOF
  • 您將運行無限循環,分配所有可用內存,如果標准輸入不包含'\\n' ,則最終崩潰,例如從空文件重定向。
  • 不太重要的是,為每個字節讀取重新分配緩沖區,效率低,但可以在以后進行優化。

這是一個更正版本:

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

int main() {
    char *string;
    int c;
    int len = 0;

    string = malloc(1);
    if (string == NULL) {
         printf("Error.\n");
         return -1;
    }
    printf("Enter a string:");
    while ((c = getchar()) != EOF && c != '\n') {
        string[len++] = c;
        string = realloc(string, len + 1);
        if (string == NULL) {
            printf("cannot allocate %d bytes\n", len + 1);
            return -1;
        }
    }
    string[len] = '\0';

    printf("Input string: %s\n", string);
    free(string);
    return 0;
}

關於你與鏈接代碼的區別的問題,它使用相同的方法,少一個bug,還有一個bug:

  • 它將字符存儲在str中的適當偏移量中。
  • 如果輸入文件不包含'\\n' ,則它會運行無限循環,與您的相同。
  • 它會調用未定義的行為,因為c未針對第一次測試進行初始化。

嘗試

*(string + size - 1) = c;

也許這有幫助

暫無
暫無

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

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