C语言实现动态char矩阵时输入读取不全问题该如何解决?
问题根因
你的char版本代码无法正常读取的核心原因是输入缓冲区残留的换行符被%c读取:
- 前面调用
scanf("%d", &r)和scanf("%d", &c)读取行数、列数时,输入数字后按下的回车键(换行符\n)会留在输入缓冲区里 %d格式符默认会跳过开头的空白字符(空格、换行、制表符等),所以int版本的代码不会受影响;但%c不会跳过任何空白字符,会直接把残留的换行符当成有效字符读取,导致实际要输入的字符额度被提前占用,看起来就像程序提前停止了输入。
解决方法
在读取完列数之后、开始循环读取字符之前,先清空输入缓冲区的残留换行;如果需求是只读取可见字符、跳过输入中的空白/换行,也可以给%c前面加空格,让scanf自动跳过所有前置空白字符。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> int main() { int r , c ; int i; char *ptr,b; printf("ROWS "); scanf("%d",&r); printf("COLS "); scanf("%d",&c); ptr = (char *)malloc((r * c) * sizeof(char)); // 清空输入缓冲区残留的换行 while(getchar() != '\n'); for (i = 0; i < r * c; i++) { // %c前加空格,跳过每次输入前的空白字符,也可按需去掉空格保留读取所有字符的能力 scanf(" %c",&b); ptr[i] = b; } for (i = 0; i < r * c; i++) { printf("%c ", ptr[i]); if ((i + 1) % c == 0) { printf("\n"); } } // 释放malloc申请的内存,避免内存泄漏 free(ptr); return 0; }
内容的提问来源于stack exchange,提问作者Nacima
相关产品推荐
相关产品推荐

