作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序读取目录“./srcs/”中的所有文件,并生成找到的文件名称的数组。
然后我使用 main 中的数组和 switch 来对每个函数进行测试。
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
void *ft_memset(void *dest, int c, size_t nofb);
char **show_dir_content(char * path)
{
DIR *dir;
struct dirent *ent;
struct dirent *entry;
char **array;
int i;
int len;
i = 0;
len = 0;
dir = opendir(path);
if(!dir)
{
perror("diropen");
return(0);
}
while((ent = readdir(dir)) != NULL)
{
if ((ent-> d_name[0]) != '.')
{
len++;
}
}
closedir(dir);
dir = opendir(path);
array = (char**)malloc(sizeof(*array) * len);
while ((entry = readdir(dir)) != NULL)
{
if ((entry-> d_name[0]) != '.')
{
array[i] = entry-> d_name;
i++;
}
}
closedir(dir);
return (array);
}
这是一个从目录读取文件并将它们放入数组的函数。想法是通过使用 switch 和 while 迭代函数的所有名称并执行测试。每个人都进行特殊测试。
为此,我使用下一个菜单:
int main(int argc, char **argv)
{
char c[6] = "123fg";
char d[6] = "123fg";
char **ptr;
int hack;
ptr = show_dir_content("./srcs/");
while(*ptr)
{
if(strcmp(*ptr, "ft_memset.c") == 0)
{
hack = 1;
}
switch (hack){
case 1:
ft_memset(c, 'A', 3);
memset(d, 'A', 4);
if(strcmp(c, d) == 0)
{
printf("%s", "OK");
}
else
{
printf("%s", "KO");
}
break;
}
ptr++;
}
free(ptr);
return(0);
}
作为测试,我使用 memset lib 函数与我自己创建的 ft_memset 函数。它有下一个代码:
#include <string.h>
void *ft_memset(void *dest, int c, size_t nofb)
{
unsigned char* p = dest;
while (nofb--)
*p++ = (unsigned char)c;
return (dest);
}
最佳答案
您不能依赖 entry
的内容继续存在于 readdir
循环之外。而且 array
的每个元素都将指向相同的字符串,因为 d_name
将是内存中的相同指针,只是每次使用不同的字符串。
替换
array[i] = entry->d_name;
与
array[i] = strdup(entry->d_name);
然后记住稍后释放数组
的每个元素。
关于c - C. 段错误中的 malloc(有时并不总是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014663/
我是一名优秀的程序员,十分优秀!