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

Eclipse C/C++ IDE中扫描字符串时回车键被当作输入的问题

问题

在Eclipse C/C++ IDE中编写计算字符串长度的C程序时,输入字符串后按回车,回车键会被当作输入内容,导致字符串多一个额外字节。但在线GDB等其他编译器中输出正常。

示例代码

#include <stdio.h>
#include <string.h>
#define MAX_LIMIT   127
int main()
{
    char str[MAX_LIMIT];
    int length;
    printf("Enter the string\n");
    fflush(stdout);               // 刷新输出缓冲区
    scanf("%[^\n]",str);
    length = strlen(str);
    printf("Length of the string is = %d\n",length);
    return 0;
}

Eclipse控制台输出

Enter the string
hello
Length of the string is = 6

其他编译器输出

Enter the string
hello
Length of the string is = 5

补充测试结果

添加打印字符编码的代码后:

printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);

输出显示多出来的是0x0d(回车符CR):

Enter the string
hello
Length of the string is = 6
68 65 6c 6c 6f 0d 00 00

解决方法

问题根源是Eclipse控制台将Windows风格的换行(CR+LF,即0x0d+0x0a)完整传入,而你用的scanf("%[^\n]", str)只排除了LF(0x0a),导致CR被读进字符串。

给你三个可行的解决方式:

  1. 读入后手动移除CR
scanf("%[^\n]", str);
size_t len = strlen(str);
if (len > 0 && str[len-1] == '\r') {
    str[len-1] = '\0';
}
  1. 修改scanf格式串,同时排除CR和LF
scanf("%[^\r\n]", str);
// 建议加上长度限制避免溢出:
// scanf("%126[^\r\n]", str);
  1. 用fgets替代scanf(更安全)
    fgets会自动读取整行,之后再去掉末尾的换行相关字符:
fgets(str, MAX_LIMIT, stdin);
size_t len = strlen(str);
if (len > 0) {
    // 移除末尾的CR或LF
    if (str[len-1] == '\n' || str[len-1] == '\r') {
        str[len-1] = '\0';
    }
}

注意:scanf("%[^\n]")存在缓冲区溢出风险,一定要加上长度限制(比如%126[^\r\n],给字符串结束符留一个位置)。

内容的提问来源于stack exchange,提问作者Tushar Mahawar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:20:43