我試圖做一個簡單的程序,使用scanf將標準輸入中的字符串讀入並放入字符串數組中(現在我只是使用它進行測試3個單詞,因此最後只有3個打印語句)。我能夠繼續閱讀,直到沒有更多的字符串,但是我遇到了一個錯誤,在循環完成後,數組中的所有字符串都是最後一個讀入的字符串。我試着把一個print語句放在循環進行調試,並且正在讀取正確的字符串。但是,當循環結束時,數組中的所有字符串都是最後一個讀入的字符串。有誰能指出我在哪裏出錯嗎?謝謝。使用scanf將字符串讀取到字符串數組中
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c = 0;
char** w_arr = malloc(3*sizeof(char*));
char* w = malloc(10*sizeof(char));
while (scanf("%s", w) == 1) {
w_arr[c] = w;
//printf("%s", w_arr[c]); debug print statement
c++;
}
printf("%s, %s, %s\n", w_arr[0], w_arr[1], w_arr[2]);
return 0;
}
您需要'malloc'一個新的'w'緩衝每'scanf'(或得到一個新的緩衝液如某種其他方式'w_arr並[c] =的strdup(W)')。就像這樣,所有數組條目都指向同一個緩衝區,其內容被每個scanf所覆蓋。 – kaylum
啊。對不起,我是新來的c。所以基本上,我所有的數組中的條目都不是指向一個字符串,而是指向一個指針。所以當循環完成時,它們都指向相同的指針,這是最後一個字符串的地址? – PCR
@PCR它不是「字符串的地址」 - 它是內存中某個空間的地址。然後你讀入該空間的第一個字符串,並使'w_arr [0]指向該空間。然後你讀第二個字符串進入該空間,並讓'w_arr [1]'指向那個空間。然後你讀入第三個字符串,並使'w_arr [2]'指向那個空間。最終結果是'w_arr [0]','w_arr [1]'和'w_arr [2]'都指向該空間,並且該空間包含第三個字符串(因爲您覆蓋了前兩個字符)。 – immibis