這就是我現在正在嘗試做的,但我不知道這是否是正確的方法,因為我最近開始學習 C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char** input = malloc(5 * sizeof(char*));
char buffer[10];
for (int i = 0; i < 5; i )
{
fgets(buffer,10,stdin);
*(input i) = buffer;
printf("%s",*(input));
}
for (int i = 0; i < 5; i )
{
printf("%s",*(input i));
}
printf("\n");
return 0;
}
在我看來,邏輯似乎很好,但我不知道為什么它不起作用
uj5u.com熱心網友回復:
如果您嘗試使用列印每個輸入索引的地址,printf("%p", *(input i));您會注意到所有地址都是相同的。
發生這種情況是因為指標指向您在執行回圈之前定義的相同陣列,因此您只需為每個指標覆寫相同的陣列fgets()
您可以通過為每次迭代創建一個帶有新參考的新陣列來解決此問題,如下所示:
char** input = malloc(5 * sizeof(char*));
for (int i = 0; i < 5; i )
{
char *buffer = malloc(10 * sizeof(char));
fgets(buffer,10,stdin);
*(input i) = buffer;
printf("%s",*(input i));
}
uj5u.com熱心網友回復:
您的代碼發生了幾件事。在您的示例中,您為 5 個指向字符的指標分配了空間,即 5 個可以指向字串的指標。
您使用以下代碼:*(input i) = buffer;. 它的真正作用是將陣列緩沖區的地址分配給您的指標。它是所有指標的相同地址。fgets函式始終覆寫此陣列中的值,因此,所有指標都指向最后讀取的同一字串。
我想,你真正想要的是讀取一個字串并存盤它。因此,您需要分別為每個字串留出空間。但是,在這樣做之前,您應該記住,'c' 中的字串必須以 '\0' 結尾,這在字串中占據了一個額外的字符位置。所以,你需要
char buffer[11] = {0};初始化為全零(至少是最后一個元素)。fgets(buffer, 10, stdin);和你一樣。- 一個簡單的技巧:
*(input i) = malloc(11);
strcpy(*(input 1), buffer);
現在,您將每個新字串復制到記憶體中的新位置并因此得到保留。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520249.html
上一篇:在處理中呼叫字串
