这是使用strcpy的好方法吗?
我尝试使用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的返回值,
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 tomalloc
中的+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 tomalloc
中的+1
,正如我所说,这是正确的。一个相当常见的错误是
stringvar = malloc(strlen(inputstring));
strcpy(stringvar, inputstring);
这无法为\0
分配空间,因此当strcpy
添加\0
时