C语言遍历目录将txt文件名存入字符串数组的代码纠错
问题说明
需要读取当前目录下所有.txt后缀文件,将文件名存入数组。目前文件后缀筛选逻辑可正常运行,但文件名存储到数组的环节存在异常,原实现代码如下:
#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <strings.h> int main() { DIR *p; struct dirent *pp; p = opendir ("./"); char file_list[10][10]; char shades[10][10]; int i = 0; if (p != NULL) { while ((pp = readdir (p))!=NULL) { int length = strlen(pp->d_name); if (strncmp(pp->d_name + length - 4, ".txt", 4) == 0) { puts (pp->d_name); strcpy(shades[i], pp->d_name); } } i = i + 1; (void) closedir (p); for(int i=0; i<4; i++){ printf("\n %s", &shades[i]); } } return(0); }
代码错误点
- 数组下标递增位置错误:
i = i + 1写在了while循环外部,匹配到txt文件时不会移动数组存储位置,所有匹配到的文件名都会覆盖写入shades[0],最终数组仅第一个位置会存储最后一个匹配到的文件名。 - 数组空间分配不足:定义
char shades[10][10]意味着每个文件名最多只能存储9个字符(需预留1位给字符串结束符\0),只要文件名(含.txt后缀)长度超过9位就会触发缓冲区溢出,引发内存异常。 - 后缀判断存在越界风险:直接计算
pp->d_name + length - 4做比对时,没有先判断文件名长度是否≥4,如果遇到文件名长度小于4的文件,会出现指针向前越界,访问非法内存。 - 遍历输出逻辑错误:遍历数组时硬编码循环上限为
i<4,如果目录下txt文件数量不是4,要么输出未初始化的脏内存数据,要么漏读已存储的文件名。 - 代码写法不规范:
printf输出字符串时,shades[i]本身就是字符串首地址,不需要额外加&取地址;定义了file_list数组但全程未使用,属于冗余代码。
修正后可运行代码
#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> // 定义常量,方便后续调整参数 #define MAX_FILE_COUNT 100 // 最多支持存储100个txt文件 #define MAX_NAME_LENGTH 256 // 单个文件名最大支持255个字符 int main() { DIR *dir_ptr; struct dirent *dir_entry; dir_ptr = opendir("./"); char file_list[MAX_FILE_COUNT][MAX_NAME_LENGTH]; int file_count = 0; if (dir_ptr == NULL) { perror("打开目录失败"); return 1; } while ((dir_entry = readdir(dir_ptr)) != NULL) { size_t name_len = strlen(dir_entry->d_name); // 先判断长度避免指针越界,再比对后缀 if (name_len >= 4 && strncmp(dir_entry->d_name + name_len - 4, ".txt", 4) == 0) { puts(dir_entry->d_name); strcpy(file_list[file_count], dir_entry->d_name); file_count++; // 存满数组后直接终止遍历,避免越界 if (file_count >= MAX_FILE_COUNT) { break; } } } closedir(dir_ptr); // 按照实际读取到的文件数量遍历输出 for (int i = 0; i < file_count; i++) { printf("%s\n", file_list[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Malindu Umeshan
相关产品推荐
相关产品推荐

