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

用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;
}

关键修改说明

  1. 替换scanf为fgets,自动限制输入长度,避免缓冲区溢出,同时读取换行符。
  2. 用strcspn移除输入字符串末尾的换行符,确保传给system的命令格式正确。
  3. 用while循环替代递归调用,彻底避免栈空间耗尽问题。
  4. 添加输入非空判断,防止执行空命令。
  5. 显式打印提示符> ,符合终端交互的预期行为。

内容的提问来源于stack exchange,提问作者Theo Marcos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:20:25