我应该使用什么:strcpy或指针?

时间:2019-09-10 16:56:25

标签: c pointers strcpy

typedef struct node{
char *name;
//etc...
}N

如果我从stdin获得char * string并将其传递给N,我可以轻松地执行N-> name = string,或者使用strcpy会更好? 哪个更正确?哪个更有效?为什么?

2 个答案:

答案 0 :(得分:2)

您要使用缓冲区从stdin读取输入。但是,如果不进行复制,则字符串将在下一次读取迭代时丢失。如果要分配内存,并且不知道收到的字符串的大小,则应使用strdup之类的函数,而不要使用strcpy。

node->name = strdup(string_to_copy);
if (node->name == NULL)
     printf("My allocation has failed!\n");

之后必须释放分配的内存。如果分配失败,您将收到一条消息(您应始终检查内存分配是否成功)。

如果您不想分配内存,并且知道输入的大小永远不会超过100,那么您可以避免出现以下情况:

typedef struct node{
char name[100];
//etc...
}N

在这种情况下,您可以使用以下内容。请注意,strcpy是一个危险函数,应格外小心:

strncpy(node->name, buffer, 100);
strcpy(node->name, buffer);

编辑:

这是一种正确释放内存的方法:

if (node->name != NULL)
{
   free(node->name);
   node->name = NULL;
}

此构造将释放您的内存并有助于防止双重释放。

答案 1 :(得分:0)

回答“结果是一样的,但是有什么区别?” (来自评论)

开始于:

N *node = malloc(sizeof(N));
char input_from_stdin[80];

如果这样做

strcpy(node->name, input_from_stdin);

我们调用了未定义的行为,但它似乎可以工作。

如果我们这样做

node->name = input_from_stdin;

node->name仅包含其期望值,直到重用input_from_stdin为止,这通常是在从输入中读取下一行时。

如果这样做

node->name = malloc(strlen(input_from_stdin) + 1);
strcpy(node->name, input_from_stdin);

我们复制存在的输入,直到我们释放它为止;但我们必须记得释放node->name之前先释放node

我们也可以

typedef struct node{
    char name[MAXSIZE];
    //etc...
 }N;

然后期望

strncpy(node->name, input_from_stdin, MAXSIZE-1)[MAXSIZE-1] = 0;

上班。

有些人做

strncpy(node->name, input_from_stdin, MAXSIZE);

这是有效的,但是再次将其重新发送会更敏感。现在在磁盘上的固定宽度记录中很少见到这种情况。我们不再喜欢MAXSIZE,而是喜欢一切可拉伸的东西。