[英]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.