用C语言实现终端程序出现随机输出及段错误问题求助
C语言简易终端实现的乱码与段错误问题修复
我编写了一段C语言代码尝试实现终端功能,期望程序提供提示符,输入shell命令(测试时使用pwd)后执行命令并返回提示符。但运行该代码时,每次都会输出随机内容,随后触发segmentation fault(段错误)。
代码如下:
#include <stdio.h> #include <stdlib.h> int parse(void) { int i = 0; int system(const char *command); char line[1024]; scanf("%[^ ]", line); system(line); do { line[i] = "\0"; i++; } while (i != 1024); parse(); } int main(void) { parse(); return 0; }
实际运行输出:
> pwd /home/runner/c-test sh: 1: �: not found sh: 1: : not found sh: 1: ׀: not found signal: segmentation fault (core dumped)
问题分析
- scanf格式字符串非法:
%[^ ]是错误写法,正确匹配换行符应该用%[^\n];且未限制输入长度,若输入超过1023字节会触发缓冲区溢出,破坏栈数据。 - 字符赋值错误:
line[i] = "\0";试图将字符串字面量的指针赋值给单个char变量,导致数组被写入随机内存地址的低字节,表现为乱码。正确写法是line[i] = '\0';(单引号包裹字符常量)。 - 无限递归栈溢出:
parse()无终止条件地递归调用自身,每次调用都会在栈上分配1024字节的line数组,最终栈空间耗尽触发段错误。 - 未处理输入缓冲区换行符:
scanf("%[^\n]", line)会留下换行符在缓冲区,下一次scanf直接读取空字符串,导致system执行空命令,出现sh: 1: ... not found错误。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void parse(void) { char line[1024]; // 打印终端提示符 printf("> "); // 用fgets读取输入,自动限制长度并处理换行符 if (fgets(line, sizeof(line), stdin) == NULL) { return; } // 移除字符串末尾的换行符 line[strcspn(line, "\n")] = '\0'; // 仅输入非空时执行命令 if (line[0] != '\0') { system(line); } } int main(void) { // 用循环替代递归,避免栈溢出 while (1) { parse(); } return 0; }
关键修改说明
- 替换
scanf为fgets,自动限制输入长度,避免缓冲区溢出,同时读取换行符。 - 用
strcspn移除输入字符串末尾的换行符,确保传给system的命令格式正确。 - 用
while循环替代递归调用,彻底避免栈空间耗尽问题。 - 添加输入非空判断,防止执行空命令。
- 显式打印提示符
>,符合终端交互的预期行为。
内容的提问来源于stack exchange,提问作者Theo Marcos
相关产品推荐
相关产品推荐

