C语言字符串输入输出逻辑错误:VS下竖排打印无输出问题
C语言竖排打印无输出问题分析与解决
问题说明
用Visual Studio编写的C代码,原本想把输入的5行字符按竖排方式打印,但运行后没有任何输出。
原代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int i, j; char a[5][15] = { 0, }; for (i = 0; i < 5; i++) { for (j = 0; j < 15; j++) { scanf("%c", &a[i][j]); } } for (i = 0; i < 15; i++) { for (j = 0; j < 5; j++) { printf("%c", a[j][i]); } } return 0; }
输入样例
AABCDD afzz 09121 a8EWg6 P5h3kx
预期输出
Aa0aPAf985Bz1EhCz2W3D1gkD6x
实际输出
无任何内容
问题原因
输入未满足程序要求,导致阻塞:原代码里的
scanf("%c")循环要读取5×15=75个字符才会进入打印阶段,但输入样例的总字符数(包括每行末尾的换行符)才31个,远不够75个。程序会一直卡在输入环节,等着用户输入更多字符,根本没机会执行打印代码,所以看不到输出。换行符被误读入数组:
scanf("%c")会读取所有输入字符,包括换行符。每行输入结束后的换行符会被当成普通字符存进数组,占了位置,但即便如此,总字符数还是不够75,程序依然会卡在输入等待状态。
解决方案
修改输入读取逻辑,只读取每行的有效字符,不需要强制读满15个,这样程序能快速完成输入阶段,进入打印环节。
修正代码(方案一:用fgets读取整行)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main(void) { int i, j; char a[5][15] = { 0, }; // 读取5行,每行最多14个字符(留位置存字符串结束符) for (i = 0; i < 5; i++) { fgets(a[i], 15, stdin); // 去掉fgets读取到的换行符 size_t len = strlen(a[i]); if (len > 0 && a[i][len-1] == '\n') { a[i][len-1] = '\0'; } } // 按竖排打印,遍历每一列 for (i = 0; i < 15; i++) { for (j = 0; j < 5; j++) { // 只打印有效字符,跳过空位置 if (a[j][i] != '\0') { printf("%c", a[j][i]); } } } printf("\n"); return 0; }
修正代码(方案二:用scanf("%s")读取整行)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int i, j; char a[5][15] = { 0, }; // %s自动跳过换行符,读取整行有效字符(无空格时适用) for (i = 0; i < 5; i++) { scanf("%s", a[i]); } for (i = 0; i < 15; i++) { for (j = 0; j < 5; j++) { if (a[j][i] != '\0') { printf("%c", a[j][i]); } } } return 0; }
代码说明
- 两种方案都能正确读取每行的有效字符,避免了强制读满15个字符导致的输入阻塞。
- 打印时判断字符是否为
\0(字符串结束符),不会打印数组里的空位置,确保输出和预期一致。
内容的提问来源于stack exchange,提问作者이시현
相关产品推荐
相关产品推荐

