You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:15:36