2010-04-21 75 views
1

即时尝试读取用户的单词,然后为单词动态分配内存并将其存储在包含char *的结构数组中。我不断得到函数的隐式声明,所以我知道我会在某个地方出错。为内存中的字符指针分配一个结构

struct unit 
{ 
    char class_code[4]; 
    char *name; 
}; 

char buffer[101]; 
struct unit units[1000]; 

scanf("%s", buffer); 

units[0].name = (char *) malloc(strlen(buffer)+1); 
strcpy(units[0].name, buffer); 
+2

我认为应该是'struct unit',而不是'struct class'。 – 2010-04-21 03:55:48

+0

@Ken,在C中完全合法。 – Earlz 2010-04-21 05:05:34

+1

@Earlz - 它是合法的C这个事实是完全不相关的。他正在声明一个标签为“class”的结构 - 这是从来没有使用过的 - 但是使用了一个结构,标签“unit”没有在任何地方声明。 – Dipstick 2010-04-21 07:04:18

回答

1

确保你正在做的:

#include <string.h> 

包括strlen的()函数的声明。另外,你应该真的使用strnlen()和strncpy()来防止错误。

+0

这里没有错误。基于知道字符串的内容,他为字符串分配足够的内存。这是绝对安全的使用'strcpy'。只要'scanf'不会溢出'buffer','strlen'的使用也很好。他可能想要在'%s'上添加一个字段长度来确保。 – 2010-04-21 03:54:46

+4

在这种情况下,''%100s''作为'scanf'格式字符串。 – caf 2010-04-21 04:00:43

7

Implicit declaration of function 'strlen'意味着你忘了#include,声明它,在这种情况下<string.h>

这就是我在你的代码中看到的唯一错误的标题。

+0

谢谢,我知道它会这样,但不能想到它是什么。即时通讯仍然是新的,所以我犯了一堆愚蠢的错误 – user321853 2010-04-21 03:53:23

2
#include <string.h> 
4

除了丢失的标题,string.h,你可以用strdup替换你的malloc + strcpy。

units[0].name = strdup(buffer); 
+0

jweyrich:是否strdup()分配内存char *?所以你可以做strcpy(单位[0] .name,“123”),然后释放(单位[0] .name)完成后?这是ANSI C吗? – Sunscreen 2010-04-21 11:11:16

+0

@防晒霜:是的 – 2010-04-21 13:15:52

+0

很酷,我会使用它,当我可以:) – Sunscreen 2010-04-21 15:04:03

相关问题