好,先来看代码中的几个可能导致运行错误的问题:
1. **包含头文件部分**:你应该显式地包含必要的头文件,如 `<stdio.h>` 和 `<io.h>`。
2. **文件打开方式**:`fopen_s` 用法不正确。`fopen_s` 的正确使用方法如下:
if (fopen_s(&fp, filename, "r") != 0) {
perror("Error opening file");
fprintf(stderr, "Can not open the file: %s\n", filename);
return 0;
}
3. **字符数组定义与传参**:字符数组定义不正确,使用动态分配或更安全的字符数组传参方式。`snprintf` 使用时目标参数要定义为字符数组。
4. **`findAllDirs` 函数未完成**:函数未完整,加入适当的函数退出条件。
改进后的代码如下:
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define MAX 256
long total = 0;
int countLines(const char* filename) {
FILE* fp;
int count = 0;
int temp;
if (fopen_s(&fp, filename, "r") != 0) {
perror("Error opening file");
fprintf(stderr, "Can not open the file: %s\n", filename);
return 0;
}
while ((temp = fgetc(fp)) != EOF) {
if (temp == '\n') {
count++;
}
}
fclose(fp);
return count;
}
void findAllCodes(const char* path) {
struct _finddata_t fa;
long handle;
char thePath[MAX], target[MAX];
snprintf(thePath, MAX, "%s/*.c", path); // Use snprintf to avoid buffer overflow
if ((handle = _findfirst(thePath, &fa)) != -1L) {
do {
snprintf(target, MAX, "%s/%s", path, fa.name);
total += countLines(target);
} while (_findnext(handle, &fa) == 0);
_findclose(handle);
} else {
fprintf(stderr, "No .c files found in directory: %s\n", path);
}
}
void findAllDirs(const char* path) {
struct _finddata_t fa;
long handle;
char thePath[MAX];
snprintf(thePath, MAX, "%s/*", path); // Use snprintf to avoid buffer overflow
if ((handle = _findfirst(thePath, &fa)) != -1L) {
do {
if (fa.attrib & _A_SUBDIR) {
if (strcmp(fa.name, ".") != 0 && strcmp(fa.name, "..") != 0) {
char subdir[MAX];
snprintf(subdir, MAX, "%s/%s", path, fa.name);
findAllCodes(subdir);
findAllDirs(subdir);
}
}
} while (_findnext(handle, &fa) == 0);
_findclose(handle);
}
}
int main() {
const char* dir = "path_to_your_directory"; // 替换为你想要遍历的目录
findAllDirs(dir);
printf("Total lines: %ld\n", total);
return 0;
}
改了这几处之后,再运行代码看看是否解决了问题。如果依然有问题,请提供具体的错误信息。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |