这是使用strcpy的好方法吗?

这是使用strcpy的好方法吗?,c,strcpy,C,Strcpy,我尝试使用strcpy;这是一个好办法吗 char *stringvar; stringvar = malloc(strlen("mi string") + 1); strcpy(stringvar, "mi string"); stringvar[strlen("mi string")] = '\0'; 你觉得怎么样?你不需要最后一行 stringvar[strlen("mi string")] = '\0'; strcpy会为您解决这一问题 在实际代码中,您必须检查malloc的返回值,

我尝试使用strcpy;这是一个好办法吗

char *stringvar;
stringvar = malloc(strlen("mi string") + 1);
strcpy(stringvar, "mi string");
stringvar[strlen("mi string")] = '\0';

你觉得怎么样?

你不需要最后一行

stringvar[strlen("mi string")] = '\0';
strcpy
会为您解决这一问题

在实际代码中,您必须检查
malloc
的返回值,以确保它不是
NULL

除此之外,您的代码还可以。特别是,您在调用
malloc
时得到了至关重要的
+1
strlen
提供字符串的长度,不包括终止的
'\0'
字符,但是
strcpy
将添加它,因此您绝对需要为它分配空间

strcpy
的问题——有人说这是一个致命的问题——就是在调用
strcpy
的那一刻,您无法告诉
strcpy
目标数组有多大。让阵列足够大并避免溢出是您的责任<代码>strcpy本身无法防止缓冲区溢出——当然,如果目标确实溢出,这是一个大问题

那么问题是,您如何确保——绝对确保——您编写的所有代码中对
strcpy
的所有调用都是正确的?您如何确保以后修改您的程序的人不会意外地把事情搞砸

基本上,如果您使用strcpy,您需要将两件事情安排在一起:

  • 安排指针变量指向要复制到其中的字符串的足够空间的代码,以及
  • strcpy
    的实际调用,它将字符串复制到该指针中
  • 所以你的代码

    stringvar = malloc(strlen("mi string") + 1);
    strcpy(stringvar, "mi string");
    
    非常接近这个理想

    我知道你的代码只是一个例子,但它确实让我们探讨了这个问题,如果以后有人修改你的程序时不小心把事情弄糟了怎么办?如果有人把它改成

    stringvar = malloc(strlen("mi string") + 1);
    strcpy(stringvar, "mi string asombroso");
    
    显然我们有问题。因此,为了确保我们复制的字符串有足够的空间,我认为,如果我们复制的字符串在一个变量中,那就更好了,所以很明显,我们复制的字符串与我们分配的空间相同

    下面是我对您的代码的改进版本:

    char *inputstring = "mi string";
    char *stringvar = malloc(strlen(inputstring) + 1);
    if(stringvar == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    strcpy(stringvar, inputstring);
    
    (不幸的是,检查
    malloc
    返回的
    NULL
    妨碍了将
    strcpy
    调用放在
    malloc
    调用旁边的目标。)

    基本上,您的代码是C库函数的一个实现,它接受您提供给它的字符串,并在
    malloc
    指定的内存中返回一个副本

    还有一件事。您担心的是all to
    malloc
    中的
    +1
    ,正如我所说,这是正确的。一个相当常见的错误是

    stringvar = malloc(strlen(inputstring));
    strcpy(stringvar, inputstring);
    
    这无法为
    \0
    分配空间,因此当
    strcpy
    添加
    \0
    时,它会溢出分配的空间,因此这是一个问题

    话虽如此,但要确保你不会意外地写信

    stringvar = malloc(strlen("mi string" + 1));
    

    你看到错误了吗?这是一个令人惊讶的容易犯的错误,但显然它并没有达到您希望它达到的目的。

    您不需要最后一行

    stringvar[strlen("mi string")] = '\0';
    
    strcpy
    会为您解决这一问题

    在实际代码中,您必须检查
    malloc
    的返回值,以确保它不是
    NULL

    除此之外,您的代码还可以。特别是,您在调用
    malloc
    时得到了至关重要的
    +1
    strlen
    提供字符串的长度,不包括终止的
    '\0'
    字符,但是
    strcpy
    将添加它,因此您绝对需要为它分配空间

    strcpy
    的问题——有人说这是一个致命的问题——就是在调用
    strcpy
    的那一刻,您无法告诉
    strcpy
    目标数组有多大。让阵列足够大并避免溢出是您的责任<代码>strcpy本身无法防止缓冲区溢出——当然,如果目标确实溢出,这是一个大问题

    那么问题是,您如何确保——绝对确保——您编写的所有代码中对
    strcpy
    的所有调用都是正确的?您如何确保以后修改您的程序的人不会意外地把事情搞砸

    基本上,如果您使用strcpy,您需要将两件事情安排在一起:

  • 安排指针变量指向要复制到其中的字符串的足够空间的代码,以及
  • strcpy
    的实际调用,它将字符串复制到该指针中
  • 所以你的代码

    stringvar = malloc(strlen("mi string") + 1);
    strcpy(stringvar, "mi string");
    
    非常接近这个理想

    我知道你的代码只是一个例子,但它确实让我们探讨了这个问题,如果以后有人修改你的程序时不小心把事情弄糟了怎么办?如果有人把它改成

    stringvar = malloc(strlen("mi string") + 1);
    strcpy(stringvar, "mi string asombroso");
    
    显然我们有问题。因此,为了确保我们复制的字符串有足够的空间,我认为,如果我们复制的字符串在一个变量中,那就更好了,所以很明显,我们复制的字符串与我们分配的空间相同

    下面是我对您的代码的改进版本:

    char *inputstring = "mi string";
    char *stringvar = malloc(strlen(inputstring) + 1);
    if(stringvar == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    strcpy(stringvar, inputstring);
    
    (不幸的是,检查
    malloc
    返回的
    NULL
    妨碍了将
    strcpy
    调用放在
    malloc
    调用旁边的目标。)

    基本上,您的代码是C库函数的一个实现,它接受您提供给它的字符串,并在
    malloc
    指定的内存中返回一个副本

    还有一件事。您担心的是all to
    malloc
    中的
    +1
    ,正如我所说,这是正确的。一个相当常见的错误是

    stringvar = malloc(strlen(inputstring));
    strcpy(stringvar, inputstring);
    
    这无法为
    \0
    分配空间,因此当
    strcpy
    添加
    \0