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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:48:18