gpt4 book ai didi

c - 无法使用 c 将内容正确添加到我的数组中

转载 作者:行者123 更新时间:2023-12-01 08:54:15 24 4
gpt4 key购买 nike

int main(void){
char name[8], comName[24];
int numComponents, numSchemes, i;


printf("\n\nHow many marking components in the course? ");
scanf("%d", &numComponents);
char *listComponents[numComponents];

i=0;
while (i<numComponents){
printf("\tenter next component name: ");
scanf("%s", name);
listComponents[i] = name;
i++;
}

printf("\nThis is name #1 = %s", listComponents[0]);
printf("\nThis is name #2 = %s", listComponents[1]);
printf("\nThis is name #3 = %s", listComponents[2]);


}

我有这个函数,它询问用户有多少个名称 numComponents,然后初始化一个大小为 *listComponents[numComponents] 的字符串数组。

然后我迭代并询问用户输入,然后在我遍历时将其放入数组中。但是我遇到了一个问题,我要输入“数学”,然后是“英语”,然后是“历史”。

但是一旦我开始打印它以查看值是什么,listComponents[0] [1] 和 [2] 都是历史记录。

我想知道是什么原因造成的,我该如何解决?我是否错误地写入数组,或尝试错误地访问数组,或两者兼而有之?

最佳答案

问题看起来您正在创建一个字符指针数组,然后将每个数组元素设置为指向同一个缓冲区。因此,每个数组元素将打印您写入缓冲区的最后一个值。

如果您想要一个包含 N 个不同输入的数组,最好创建 N 个 字符串并存储指向 字符串的指针。看看,例如,strdup() (或者出于安全考虑,可能是 strndup())。记住要 free() 分配内存 :)

例如

while (i<numComponents){
printf("\tenter next component name: ");
scanf("%s", name);
listComponents[i] = strdup(name); //<---- pointer notice **copy** of buffer stored, not pointer to buffer :)
...
...
<snip>
...
...

for(i=0; i<numComponents;++i) free(listCompoents[i]);

你做得到的方式

listComponents[0] ----- points to ------> name[]
listComponents[1] ----- points to ----/
listComponents[2] ----- points to ---/
...
listComponents[n] ----- points to -/

因此,您可以看到它们都指向同一个缓冲区或内存区域,因此打印每个总是会在任何时候产生 name[]

中的字符串

使用 strdup() 你得到

listComponents[0] ----- points to ------> new buffer in memory holding copy of name[]
listComponents[1] ----- points to ------> new buffer in memory holding copy of name[]
listComponents[2] ----- points to ------> new buffer in memory holding copy of name[]
...
listComponents[n] ----- points to ------> new buffer in memory holding copy of name[]

注意:复制任何用户输入时,尽管我使用了 strdup(),但您可能希望使用 strndup() 以避免大超出 name[] 缓冲区的用户输入或用户输入。如果您正在 malloc()ing 一个恒定的缓冲区大小,然后 strcpy()ing 您肯定想使用 strncpy() 来避免溢出您的分配的缓冲区

关于c - 无法使用 c 将内容正确添加到我的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26530395/

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