如何拆分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
相关产品推荐
相关产品推荐

