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被读进字符串。
给你三个可行的解决方式:
- 读入后手动移除CR
scanf("%[^\n]", str); size_t len = strlen(str); if (len > 0 && str[len-1] == '\r') { str[len-1] = '\0'; }
- 修改scanf格式串,同时排除CR和LF
scanf("%[^\r\n]", str); // 建议加上长度限制避免溢出: // scanf("%126[^\r\n]", str);
- 用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
相关产品推荐
相关产品推荐

