Tôi gặp một vấn đề, khi tôi sử dụng scanf để lưu một chuỗi vào một con trỏ char, tôi có 3 đầu vào - tên, họ và tuổi, giá trị char cuối cùng của họ được thay thế bằng đầu ra tuổi để giải thích rõ hơn.
Độ nhạy Q v0.0.1
Nhập tên của bạn
Evgeny
Nhập họ của bạn
Danilenko
Nhập tuổi của bạn
hai mươi hai
Evgeny Danilenk22, bạn 22 tuổi
đây là mã
void getUserDetails(char** value)
{
char *key[3] = {"tên", "họ", "tuổi"};
int keySize = sizeof(key)/sizeof(char*);
printf("Q-riosity v0.0.1\n");
int i = 0;
for(i = 0; i
{
printf("Nhập %s \n", key[i]); // tên, họ, tuổi
scanf("%s", &value[i]); //lưu trữ giá trị tại chỉ mục i
}
printf("%s, %s, bạn %s tuổi\n", &value[0], &value[1], &value[2]);
}
biên tập
nhập tên của bạn
Yevgeny
Nhập họ của bạn
Danilenko
Nhập tuổi của bạn
hai mươi hai
lỗi phân biệt
int main(int argc, char* argv[])
{
char *key[3] = {"tên", "họ", "tuổi"};
int keySize = sizeof(key)/sizeof(char*);
printf("Q-riosity v0.0.1\n");
giá trị char*[keySize];
int i = 0;
for(i = 0; i
{
printf("Nhập %s \n", key[i]);
scanf("%s", value[i]);
}
for(i = 0; i
{
printf("%s : %s \n", key[i], value[i]);
}
return 0;
}
Vâng, đầu ra Danielk22
cho biết của bạn value
Biến được khai báo trong lệnh gọi dưới dạng mảng ký tự liền kề có kích thước 8.
khi bạn đọc Danilenko
Phần họ bạn viết 10 ký tự (kể cả dấu kết thúc \0
. 8 cái đầu tiên điền vào mảng lưu giữ và 2 cái cuối cùng điền vào tuổi mảng. Khi đọc tuổi sau này nó sẽ ghi đè lên 2 ký tự này.
Hãy nhìn vào bộ nhớ (? là viết tắt của các ký tự đơn vị hoặc không liên quan):
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
Và thế hệ ? ?
E vgeny \0 ? D anilenko \0 ?
E vgeny \0 ? D anilenk 2 2 \0 ?
Nhưng trên kiến trúc 64-bit, tám ký tự cũng có thể có kích thước bằng một con trỏ...
Chỉnh sửa của bạn cho thấy rằng bạn đã không khởi tạo đúng cách con trỏ value
mảng. Giả sử bạn muốn tên và họ có 32 ký tự và tuổi là 4 ký tự, bạn có thể làm điều này:
char _v0[32], _v1[32], _v2[4];
giá trị char*[keySize] = { _v0, _v1, _v2 };
Bằng cách này, chương trình sẽ không còn bị lỗi nữa.
Tôi là một lập trình viên xuất sắc, rất giỏi!