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

如何拆分popen调用ls后fgets返回的字符串为单词并存入字符串数组

问题解决:拆分popen执行ls的输出到字符串数组

你需要实现通过popen执行ls命令,将输出的文件/目录名拆分存入字符串数组,你更新后的代码仍然存在核心逻辑错误,以下是问题分析和修正方案:

现有代码核心问题

  • 拆分规则错误:ls默认输出为每行一个文件名,而非空格分隔,用空格拆分不仅无法正确识别多文件,遇到带空格的文件名还会拆分错误
  • 单次读取遗漏数据:仅调用一次fgets只能读取一行输出,多文件场景下会丢失大部分结果
  • 循环判断逻辑错误:words为二维字符数组而非指针数组,words[i]!=NULL的判断永远为真,会造成数组越界访问
  • 缺少错误校验:未判断popen的返回值,命令执行失败时程序会直接崩溃
  • 边界防护缺失:未限制文件名长度和文件数量,超出数组定义的100长度时会触发内存越界

修正后的可运行代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_FILE_CNT 100
#define MAX_NAME_LEN 100

int main(void){
    char op[MAX_NAME_LEN];
    char words[MAX_FILE_CNT][MAX_NAME_LEN] = {0}; // 初始化数组方便后续操作

    int cnt = 0;
    FILE *ls = popen("ls", "r");
    if (ls == NULL) {
        perror("popen执行失败");
        return 1;
    }

    // 循环读取每一行,每一行对应一个独立文件名
    while (fgets(op, sizeof(op), ls) != NULL && cnt < MAX_FILE_CNT) {
        // 移除fgets读取到的末尾换行符
        size_t len = strlen(op);
        if (len > 0 && op[len - 1] == '\n') {
            op[len - 1] = '\0';
        }
        // 安全复制到结果数组
        strncpy(words[cnt], op, MAX_NAME_LEN - 1);
        cnt++;
    }
    pclose(ls);

    // 输出所有读取到的文件名
    for (int i = 0; i < cnt; i++) {
        printf("%s\n", words[i]);
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:54:06