gpt4 book ai didi

c - scanf() 不写入二维字符数组

转载 作者:行者123 更新时间:2023-12-05 08:35:44 25 4
gpt4 key购买 nike

我正在阅读一本使用 Code::Blocks v20.03 IDE 自学 C 编程的教科书。

我真的被一个小程序迷住了,这个小程序将三个小字符串读入一个二维字符数组,然后将它们打印到屏幕上。该程序的代码如下所示。

#include <stdio.h>

int main(void)
{
char *colors[3][10] = {'\0'};

printf("\nEnter 3 colors seperated by spaces: ");
scanf("%s %s %s", colors[0][0], colors[1][0], colors[2][0]);

printf("\nYour entered: ");
printf("%s %s %s\n", colors[0][0], colors[1][0], colors[2][0]);
return 0;
}

编译时出现零错误或警告,执行时产生以下输出。

您输入了:(null) (null) (null)

使用 IDE 的 Watches 窗口显示没有任何内容写入数组。我知道数组名称被视为指向数组中第一个元素的指针。我还了解使用下标/索引访问数组维度内的元素(例如整数数组),因此需要在此 char 数组中将数组第二维保持为零。

可悲的是,这让我完全不知所措,所以我需要帮助来填补我的理解空白。

最好的问候,

斯图尔特

最佳答案

当使用带有%s 说明符的scanf 时,您必须提供一个指向内存地址的指针,以便scanf 写入。因此,您必须首先创建一个内存缓冲区,该缓冲区有足够的空间来存储整个字符串。最简单的方法是声明一个 char 类型的数组。

但是,行

char *colors[3][10] = {'\0'};

不会声明char 类型的数组。相反,它将创建一个多维指针数组。

如果你想创建一个char类型的数组,你可以这样做:

char color[10];

如果你想创建一个char类型的数组,你可以这样做:

char colors[3][10];

现在你可以使用这条线了

scanf( "%s %s %s", colors[0], colors[1], colors[2] );

相当于

scanf( "%s %s %s", &colors[0][0], &colors[1][0], &colors[2][0] );

由于array to pointer decay .在大多数情况下,如果您在表达式中使用数组名称,它将衰减为指向数组第一个元素的指针。

请注意,使用 %s 是危险的,因为如果用户输入的数据多于内存缓冲区的容量(在本例中超过 9 个字符),那么您将得到一个 buffer overflow。 ,这导致 undefined behavior .

因此,这样写会比较稳妥:

scanf( "%9s %9s %9s", colors[0], colors[1], colors[2] );

这将每个字符串的匹配字符数限制为 9 个字符,因此 scanf 永远不会写入超过 10 个字符( 9 个 字符加上终止空字符)放入内存缓冲区。

关于c - scanf() 不写入二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73249583/

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