gpt4 book ai didi

c - scanf 用下一个 scanf 输入替换 char 数组中的最后一个元素

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:00 28 4
gpt4 key购买 nike

我遇到了一个问题,当我使用 scanf 将字符串存储到 char 指针中时,我有 3 个输入 - 姓名、姓氏和年龄,姓氏的最后一个 char 值被替换为年龄输出以更好地解释。

Q-riosity v0.0.1
Enter your name
Evgeny

Enter your surname
Danilenko

Enter your age
22

Evgeny Danilenk22, you are 22 years old

这是代码

void getUserDetails(char** value)
{
char *key[3] = {"name", "surname", "age"};
int keySize = sizeof(key)/sizeof(char*);
printf("Q-riosity v0.0.1\n");

int i = 0;

for(i = 0; i<keySize; i++)
{
printf("Enter your %s \n", key[i]); // name, surname, age
scanf("%s", &value[i]); //stores value at index i
}

printf("%s, %s, you are %s years old\n", &value[0], &value[1], &value[2]);
}

编辑

输入你的名字
叶夫根尼

输入您的姓氏
丹尼连科

输入您的年龄
22

段错误

int main(int argc, char* argv[])
{

char *key[3] = {"name", "surname", "age"};
int keySize = sizeof(key)/sizeof(char*);
printf("Q-riosity v0.0.1\n");
char* value[keySize];

int i = 0;
for(i = 0; i<keySize; i++)
{
printf("Enter your %s \n", key[i]);
scanf("%s", value[i]);
}


for(i = 0; i<keySize; i++)
{
printf("%s : %s \n", key[i], value[i]);
}


return 0;
}

最佳答案

嗯,输出 Danilenk22 表明您的 value 变量在调用方中声明为大小为 8 的连续字符数组。

当您读取 Danilenko 作为姓氏时,您写入 10 个字符(包括终止符 \0。前 8 个填充保留数组,最后 2 个进入数组年龄。当您稍后读取年龄时,它会覆盖这 2 个字符。

让我们看看内存(?代表单元化或无关字符):

   0  1  2  3  4  5  6  7  0  1  2  3  4  5  6  7  0  1  2  3  4  5  6  7
E v g e n y \0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
E v g e n y \0 ? D a n i l e n k o \0 ? ? ? ? ? ?
E v g e n y \0 ? D a n i l e n k 2 2 \0 ? ? ? ? ?

但是在 64 位架构上八个字符也可能是指针的大小......

您的编辑表明您未能正确初始化指针的 value 数组。假设您希望 name 和 surname 有 32 个字符,年龄有 4 个字符,您可以这样做:

char _v0[32], _v1[32], _v2[4];
char* value[keySize] = { _v0, _v1, _v2 };

这样程序就不会再出现段错误了。

关于c - scanf 用下一个 scanf 输入替换 char 数组中的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132079/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com