scanf无法写入二维char数组,程序输出全为(null)求助
问题分析与解决方案:读取字符串到二维数组输出全为(null)
你的代码核心错误是数组类型定义错误,导致scanf无法正确写入数据:
问题根源
你定义的char *colors[3][10]是一个3行10列的二维指针数组,每个元素都是char*类型。初始化时{'\0'}会把所有指针元素设为空指针('\0'等价于整数0,对应空指针地址)。当你用scanf("%s", colors[0][0])时,本质是试图往空指针指向的无效内存地址写入数据,这属于C语言中的未定义行为——不仅写不进数据,还可能引发程序崩溃。printf用%s打印空指针时,就会输出(null)。
修正后的代码
把指针数组改成二维字符数组,才能直接存储字符串内容:
#include <stdio.h> int main(void) { // 定义3个长度为10的字符数组,每个最多存9个字符+1个结束符'\0' char colors[3][10] = {0}; printf("\nEnter 3 colors separated by spaces: "); // 直接传数组名(指向该行首元素的指针),或者&colors[i][0]也可 scanf("%s %s %s", colors[0], colors[1], colors[2]); printf("\nYou entered: "); printf("%s %s %s\n", colors[0], colors[1], colors[2]); return 0; }
关键知识点补充
- 二维字符数组 vs 二维指针数组:
char arr[N][M]:是真正的二维字符数组,分配了连续的N*M字节内存,每个arr[i]是长度为M的字符数组,可直接存储字符串。char *arr[N][M]:是指针数组,每个元素是指向char的指针,需要先为每个指针分配内存(比如用malloc)才能存储字符串,否则就是空指针或野指针。
- 字符串存储要求:C语言的字符串必须以
'\0'结尾,{0}初始化会把整个数组填为'\0',确保即使输入的字符串长度不足,也能正确被printf识别为字符串。 - scanf的%s参数:需要传入指向字符数组首元素的指针,二维字符数组的
arr[i]本身就是指向该行首元素的指针,因此可以直接作为参数传入。
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

