- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经尝试调试了一段时间,仍然无法弄清楚为什么这会导致堆栈粉碎错误(我认为错误代码是 6,或者中止。本质上这个函数需要一个目录,打开一个文件然后将该文件放入一个函数中,以便它可以使用该文件,然后输出它通过该函数的次数。
int map(char* dir, void* results, size_t size, int (*act)(FILE* f, void* res, char* fn))
{
printf("%s\n", dir);
char copyDirectory[strlen(dir)+1];
//adds the slash
strcpy(copyDirectory, dir);
strcat(copyDirectory, "/");
//before the psuedocode, get all the files in the directory
int numFiles = nfiles(copyDirectory);
DIR* directory = opendir(copyDirectory);
//if there aren't any files, then we exit
if(numFiles == 0)
{
closedir(directory);
return -1;
}
//reads the file from the directory
struct dirent* readFile = readdir(directory);
int output = 0;
while(readFile!=NULL)
{
if(readFile->d_type==DT_REG)
{
//step 2: obtain filepath
char* fileName = readFile->d_name;
int filePathLength = strlen(dir) + strlen(fileName) + 1;//add one for the slash
char filePath[filePathLength];
memset(filePath, 0, filePathLength); //allocat ememory for file path
strcpy(filePath, strcat(dir, fileName));
//step 3: open file
FILE* file = fopen(filePath, "r");
//if the file is unreachable, exit
if(file==NULL)
{
closedir(directory);
return -1;
}
//step 4: perform some action and store result
strcpy(dir, copyDirectory);
act(file, results, fileName);
//step 5: close file
fclose(file);
//to go through loop: increment the readFile
++output;
}
readFile = readdir(directory);
}
closedir(directory);
return output;
}
map 函数与例子。
int map(char* dir, void* results, size_t size, int (*act)(FILE* f, void* res, char* fn))
{
char* copyDirectory = strdup(dir);
DIR* directory = opendir(dir);
int output = 0;
struct dirent* readFile = readdir(directory);
while(readFile!=NULL)
{
if(readFile->d_type==DT_REG)
{
//step 2: obtain filepath
char* fileName = readFile->d_name;
int filePathLength = strlen(dir) + strlen(fileName) +2;//add one for the slash
char filePath[filePathLength+1];
memset(filePath, 0, filePathLength); //allocat ememory for file path
strcpy(filePath, strcat(dir, fileName));
//step 3: open file
FILE* file = fopen(filePath, "r");
//if the file is unreachable, exit
if(file==NULL)
{
closedir(directory);
return -1;
}
//step 4: perform some action and store result
strcpy(dir, copyDirectory);
act(file, results, fileName);
//step 5: close file
fclose(file);
//to go through loop: increment the readFile
++output;
}
readFile = readdir(directory);
}
closedir(directory);
return output;
}
//Sample Map function action: Print file contents to stdout and returns the number bytes in the file.
int cat(FILE* f, void* res, char* filename) {
char c;
int n = 0;
printf("%s\n", filename);
while((c = fgetc(f)) != EOF) {
printf("%c", c);
n++;
}
printf("\n");
return n;
}
int main(int argc, char const *argv[])
{
char directory[]= "../rsrc/ana_light/";
size_t size = 100;
void* results[500];
int mapCat = map(directory, results, size, cat);
printf("The value of map is %d.\n", mapCat);
return EXIT_SUCCESS;
}
失败的地方是在它执行并打印到输出之后。该函数应打印出您拥有的文件的内容。目录列表末尾需要有一个“/”。目前它打印文件内容并以读取的文件数的值退出,但在退出并出现堆栈粉碎错误后它会消失。
EDIT1:编辑代码以反射(reflect)我所做的更改。
EDIT2:我认为是根据 MCVE 标准完成的?如果我没记错的话应该会跑。
最佳答案
第一个问题:变化
char copyDirectory[strlen(dir)+1];
到
char copyDirectory[strlen(dir)+2];
第二个问题:改变
char filePath[filePathLength];
到
char filePath[filePathLength+1];
第三个问题(初读时似乎没有变化):
//strcpy(copyDirectory, dir);
strcat(copyDirectory, dir);
注释掉的代码是正确的:
strcpy(copyDirectory, dir);
您忘记了尾随空字符的空格。
第四个问题:你忘记处理 opendir 失败了。
第五个问题:这段代码是错误的:
memset(filePath, 0, filePathLength); //allocat ememory for file path
strcpy(filePath, strcat(dir, fileName));
更改为:
strcpy(filePath, copyDirectory);
strcat(filePath, fileName);
不要在此处写入您的输入变量。这是一个非常糟糕的主意。
在撤消 copyDirectory 的(泄漏的)strdup 并将您非常创新的本地缓冲区放回之后,我能够让代码运行到完成。
关于c - 使用 strcpy 和 strcat 时堆栈粉碎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39432110/
Video explaining for those who does not understand 此答案未正确回答,请尝试使用其他解决方案来回答(100 Bounty 已过期) 同样的问题,但解释
我有一个使用线程来从文件中读取一些内容的 Activity 。 问题是,如果用户决定在线程运行时旋转屏幕,应用程序就会崩溃。 我知道我可以使用以下方法阻止屏幕旋转: android:screenOri
我正在上计算机安全课并且正在阅读 http://phrack.org/issues/56/8.html .在 bo3.cpp 中,作者创建了他自己的 VTABLE,并覆盖 VPTR 以指向他的 VTA
我们在 Mesos 0.17 上针对 CDH5 运行 Spark 0.9.1。到目前为止,我们继续使用 CDH 系列的“mr1”版本,以便我们可以运行 filecrush。项目在我们的小文件上。由于各
我知道如何删除文件以使它们无法恢复。但是,如何以导致相同结果的方式从 POSIX 环境中的 MySQL 表中删除行?在继续删除该行之前,我目前正在使用与原始数据长度相同的无效字符串重写所有数据。它有效
我有一个如下所示的 XML 文件:
我正在尝试使用 Tween 和平面几何在 Three.js 中创建玻璃 splinter 效果,但有点迷失。网格/几何体不会随补间更新,如果我在第一次渲染之前调用 shatter(),您可以看到补间正
我正在尝试使用我在 XML 中接收的一些日志数据。 在清理数据以使其成为有效的 XML 之后,我在 SQL Server 中获得了 XML 数据包。 (并从 JSON 包装器等中获取其他属性) 但是现
当我将 slim-rails 添加到 Gemfile 并启动我的应用程序时,它崩溃并出现以下错误: /Users/rado/.rbenv/versions/2.3.1/gemsets/project/
我是一名优秀的程序员,十分优秀!