2017-06-02 90 views
-1

我有动态分配的一些问题,因为我不想指定数组的大小。基本上我在我的程序中需要的是将一个文件的名称存储在一个数组中,并确保它不会浪费空间。如何在C中动态分配名称数组?

我试图做类似创建阵列name[255],以确保它有足够的空间,然后动态地分配它,所以它只有所需的空间,就像写“matrix5”,然后将其存储在name[255]然后更改name[255]name[8]

char file_name[255]; 

printf("what is the name of the file? [.txt]\n"); 
scanf_s(" %s", file_name[255]); //store name eg: "matrix5" 

i = 0; 
char **fullpath; 
while (file_name[i] != '\0' && i <=strlen(file_name)) 
{ 
    fullpath= (char**)malloc(sizeof(char*)); //In here it would then make file_name[255] into file_name[8]        
    fullpath[i] = file_name[i]; 
    i++; 
} 

我需要在这里做什么?

+3

发布您使用的代码,样本输入和预期输出。 – chux

+3

一如既往,'scanf_s()'使用不正确。 – EOF

+2

'scanf_s(“%s”,file_name);'缺少长度参数。 – chux

回答

1

那你是怎么会动态分配一个C-字符串:

char* name = malloc(sizeof(char)*(length+1)); //length of the filename plus \0 
+1

好奇,因为'sizeof(char)'总是1,为什么用'sizeof(char)*(length + 1)'而不是'length + 1'或'sizeof * name *(length + 1)'? – chux

+0

我喜欢一致性,所以当需要int大小时,可以用'int'替换'char'。而且复制代码修改变得更容易。 – Shiro

+5

我认为这是'sizeof * name'这个建议的要点,它的维护率低,可以是一致的编码风格。 –

0

你熟悉strdup

这将返回一个指向已分配内存的指针(稍后需要由您自由释放)和一个字符串副本,并使代码更加简单。

提示:如果您不复制常量字符串,请使用strndup

3

文件名和路径名通常具有系统可以处理的最大长度。示例MAX_PATH。声明数组为hold用户输入。国际海事组织,我会使用一个2x大小的阵列用户输入。

//        +1 for \n 
#define MY_BUFFER_SIZE (MAX_PATH*2 + 1) 
char my_buffer[MY_BUFFER_SIZE]; 

读取文件名

printf("what is the name of the file? [.txt]\n"); 
if (fgets(my_buffer, sizeof my_buffer, stdin) == NULL) { 
    Handle_EnfOfFile_or_InputError(); 
    return NULL; 
} 

砍掉了潜在尾随\ n

my_buffer[strcspn(my_buffer, "\n")] = '\0'; 

创建重复

return strdup(my_buffer); 

strdup()是不是一个独立C库函数但很容易编码。 Example