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

使用scanf输入字符时do-while循环无法在空字符处终止的问题

帮你排查字符数组输入循环的问题

嘿,别焦虑!作为刚接触编程的新手,遇到这种卡壳的情况太正常了,咱们一点点拆解问题~

首先,你循环停不下来的核心原因是终止条件完全错配:

  • 你按下ENTER键时,输入的是换行符'\n',但你的循环判断的是a[i-1]!='\0'——'\0'是字符串结束符,不是回车键对应的字符,除非你手动输入\0(没人会这么做),否则循环永远不会因为按ENTER终止。
  • 另外,你的循环条件里i<=50也有问题:数组a[50]的下标范围是0到49,当i=50时,&a[50]已经超出了数组的内存范围,会导致未定义行为(比如程序崩溃或者乱码)。

给你几个关键提示,不用完整代码也能自己修正:

  1. 把循环终止条件改成判断读取到的字符是不是'\n',同时控制i不超过49(保证数组不越界)
  2. 循环结束后,记得把数组里的换行符替换成'\0'(或者直接截断),不然后面的for循环会输出多余的垃圾字符
  3. 后面的输出循环不要固定循环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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:08:14