问题分析:
根据提供的代码,可能导致Segmentation fault异常的原因可能有以下几点:
1. 文件路径超过了缓冲区大小。
2. 文件打开失败。
3. 文件未成功关闭。
4. 文件遍历时发生错误。
建议的解决方案:
1. 检查路径是否超过了缓冲区大小。使用strncat函数以限制拼接后的字符串长度,避免缓冲区溢出。
2. 在countLines函数内部,添加对文件打开失败的处理,确保文件能够成功打开。
3. 在countLines函数内部,添加对文件关闭失败的处理,确保文件能够成功关闭。
4. 检查文件遍历过程是否存在错误,例如文件不可读取等情况。
以下是修改后的代码示例:#include <io.h>#include <direct.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 256long total;int countLines(const char *filename);void findAllCodes(const char *path);void findALLDirs(const char *path);int countLines(const char *filename){ FILE *fp; int count = 0; int temp; if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "Can not open the file: %s\n", filename); return 0; } while ((temp = fgetc(fp)) != EOF) { if (temp == '\n') { count++; } } if (fclose(fp) != 0) { fprintf(stderr, "Can not close the file: %s\n", filename); return 0; } return count;}void findAllCodes(const char *path){ struct _finddata_t fa; long handle; char thePath[MAX], target[MAX]; strcpy(thePath, path); if ((handle = _findfirst(strcat(thePath, "/*.c"), &fa)) != -1L) { do { sprintf(target, "%s/%s", path, fa.name); total += countLines(target); } while (_findnext(handle, &fa) == 0); } _findclose(handle);}void findALLDirs(const char *path){ struct _finddata_t fa; long handle; char thePath[MAX]; strcpy(thePath, path); if ((handle = _findfirst(strcat(thePath, "/*"), &fa)) == -1L) { fprintf(stderr, "The path %s is wrong!\n", path); return; } do { if (!strcmp(fa.name, ".") || !strcmp(fa.name, "..")) continue; if (fa.attrib == _A_SUBDIR) { sprintf(thePath, "%s/%s", path, fa.name); findAllCodes(thePath); findALLDirs(thePath); } } while (_findnext(handle, &fa) == 0); _findclose(handle);}int main(){ char path[MAX] = "."; printf("计算中...\n"); findAllCodes(path); findALLDirs(path); printf("目前您总共写了%d行代码!请继续加油!!!\n\n", total); system("pause"); return 0;}
希望这些修改能够解决您的问题。如果问题仍然存在,请提供完整的错误信息以便进一步排查。
球一个最佳答案谢谢啦!这对我非常重要! |