gpt4 book ai didi

c - 计算文件夹中文件使用的字节数时遇到问题。出现段错误错误

转载 作者:行者123 更新时间:2023-11-30 18:32:58 25 4
gpt4 key购买 nike

我目前正在尝试计算某个目录中文件消耗的字节数。它递归地遍历当前目录上的所有文件夹并计算文件的字节数。

当我递归调用函数rec_bytes时,我打印出“Go in”...但是当它返回值时...它出现段错误。

我在下面的代码中标记了有问题的行。

我认为问题与打开/关闭目录有关。

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>

int rec_Bytes(char path[])
{
int bytesSum = 0;
printf("PathX %s\n", path);
DIR *mydir = opendir(path); // Look in current directory

struct dirent *entry = NULL;

while((entry = readdir(mydir))) /* If we get EOF, the expression is 0 and
* the loop stops. */
{
if (!isDir(entry->d_name)) // Check to see if the entry is a directory of a file
{
char tempPath[] = "";
strcat(tempPath, path);
strcat(tempPath,"/");
strcat(tempPath,entry->d_name);
int tempSum = fileSize(tempPath); // Get file size
bytesSum += tempSum; // Add to sum
printf("%s\t%d\n", entry->d_name, tempSum);
}
else // The current entry is a directory
{
if ((strcmp((entry->d_name),"..") != 0) && (strcmp((entry->d_name),".")) != 0)
{
printf("Directory%s\n", entry->d_name);
char tempPath[] = "";
strcat(tempPath, path);
strcat(tempPath,"/");
strcat(tempPath,entry->d_name);
printf("Go in\n");


int tempSum = rec_Bytes(tempPath); <<<<<< Get segmentation fault here.


printf("Come Out%d\n", tempSum);
bytesSum += tempSum;
printf("%s\t%d\n", entry->d_name, tempSum);
}
}
}
closedir(mydir);
printf("XXXX\t%s\t%d\n", path, bytesSum);
return bytesSum;
}

// Thanks to : http://cboard.cprogramming.com/cplusplus-programming/117431-how-tell-if-file-directory.html
int isDir(const char* target)
{
struct stat statbuf;
stat(target, &statbuf);
return S_ISDIR(statbuf.st_mode);
}

最佳答案

你的问题是这样的......

char tempPath[] = "";

这将分配一个带有一个字节的缓冲区,该字节是一个空字符。该缓冲区中没有空间容纳任何更长的字符串。

基本上,C 没有动态调整大小的字符串。它具有以空结尾的字符串,这些字符串位于固定大小的字符数组中。当然,当您在完成构建之前无法知道字符串的长度时,这会产生一个问题。

尝试类似...

char tempPath[5000] = "";

作为快速修复。另外,查找 strncat - 它不太可能出现段错误。还有一个 printf 变体,但这些天我使用了太多 C++。

编辑

实际上,段错误可能是由于那些 strcats 和 printfs 损坏了堆栈造成的。段错误可能发生在函数尝试返回时。不过,基本问题是字符串缓冲区太小。

哎呀!

真正的快速解决方法是......

char tempPath[5000];
tempPath [0] = 0;

否则,它不会总是在您期望的时候初始化为空字符串。

关于c - 计算文件夹中文件使用的字节数时遇到问题。出现段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2170324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com