使用scanf输入字符时do-while循环无法在空字符处终止的问题
帮你排查字符数组输入循环的问题
嘿,别焦虑!作为刚接触编程的新手,遇到这种卡壳的情况太正常了,咱们一点点拆解问题~
首先,你循环停不下来的核心原因是终止条件完全错配:
- 你按下ENTER键时,输入的是换行符
'\n',但你的循环判断的是a[i-1]!='\0'——'\0'是字符串结束符,不是回车键对应的字符,除非你手动输入\0(没人会这么做),否则循环永远不会因为按ENTER终止。 - 另外,你的循环条件里
i<=50也有问题:数组a[50]的下标范围是0到49,当i=50时,&a[50]已经超出了数组的内存范围,会导致未定义行为(比如程序崩溃或者乱码)。
给你几个关键提示,不用完整代码也能自己修正:
- 把循环终止条件改成判断读取到的字符是不是
'\n',同时控制i不超过49(保证数组不越界) - 循环结束后,记得把数组里的换行符替换成
'\0'(或者直接截断),不然后面的for循环会输出多余的垃圾字符 - 后面的输出循环不要固定循环50次,应该只循环到你实际输入的字符数量为止,避免输出未初始化的数组内容
修改后的核心循环示例(符合你不能用指针、getchar的要求):
#include <stdio.h> main() { char a[50]; int i; printf("Give max 50 characters\n"); i=0; do { scanf("%c", &a[i]); // 提前判断,如果是换行符就终止循环,避免数组多存一个换行符 if(a[i] == '\n') { break; } i=i+1; } while(i < 50); // 数组最多存49个有效字符,留位置放结束符 // 添加字符串结束符,保证输出正常 a[i] = '\0'; // 只输出到结束符的位置,避免垃圾字符 for(i=0; a[i]!='\0'; i++) printf("%c", a[i]); }
或者也可以在while条件里直接判断,逻辑更紧凑:
do { scanf("%c", &a[i]); i=i+1; } while(i < 50 && a[i-1] != '\n'); // 把换行符替换成结束符,确保字符串格式正确 if(a[i-1] == '\n') { a[i-1] = '\0'; } else { a[i] = '\0'; }
慢慢来,这些都是新手刚接触C语言数组和输入时很容易踩的坑,完全不是“无知”的问题——毕竟没人一开始就懂这些细节😉
内容的提问来源于stack exchange,提问作者S. Kats.
相关产品推荐
相关产品推荐

