C语言二维字符串数组输入后无法正常输出:问题排查与修复
问题分析与修复方案
首先,你的代码存在两个核心错误,都是因为对二维char数组的结构和scanf/printf格式符的用法理解有误:
错误1:scanf("%s", &col[i][j]) 参数错误
char col[100][100] 定义的是100个长度为100的字符串数组——也就是说,col[i]本身就是一个可以存储字符串的char数组(等价于char*类型,指向第i个字符串的首地址)。
而你写的&col[i][j]是单个char的地址,当用%s格式符读取字符串时,scanf会从这个地址开始连续写入字符直到遇到空白符,这会直接越界覆盖后续内存(包括其他行的数组内容),导致内存混乱。
错误2:printf("%s\t", col[i][j]) 格式符不匹配
col[i][j]是一个单个char类型的值,但%s格式符要求传入的是char*类型的指针(字符串的首地址)。把char值当作指针使用会导致程序访问非法内存,出现乱码、崩溃等未定义行为。
接下来根据你的需求给出两种修复方案:
方案1:如果你想输入4个独立的字符串(2行2列排列)
我们可以用三维数组来明确区分行和列的字符串,这样col[i][j]就是第i行第j列的字符串:
#include <stdio.h> #include<string.h> int main() { char col[2][2][100]; // 2行2列,每个位置存一个最多99字符的字符串 int i,j; for(i=0; i<2; i++) { for(j=0; j<2; j++) { scanf("%s", col[i][j]); // col[i][j]直接作为字符串首地址 } } for(i=0; i<2; i++) { for(j=0; j<2; j++) { printf("%s\t", col[i][j]); } printf("\n"); } return 0; }
方案2:如果你想输入的是2x2的字符网格(每个位置是单个字符)
这种情况应该用%c格式符读取和打印单个字符,注意要跳过输入时的换行、空格等空白符(在scanf前加空格即可):
#include <stdio.h> #include<string.h> int main() { char col[100][100]; int i,j; for(i=0; i<2; i++) { for(j=0; j<2; j++) { // 加空格跳过输入时的空白符,避免读取到换行 scanf(" %c", &col[i][j]); } } for(i=0; i<2; i++) { for(j=0; j<2; j++) { printf("%c\t", col[i][j]); // 用%c打印单个字符 } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者virtual
相关产品推荐
相关产品推荐

