笔者今天在群里看到一个老哥在刷面试问了这么个问题:
void test1()
{
char str[10];
char* str1 = "0123456789";
strcpy(str ,str1);
printf("Copied string: %s\r\n", str);
}
这个函数的问题出在哪?
首先说明char * str1="123456789";这个声明方式在有的编译器里面是不可行的,比如Visual Stdio里面,报错“const char* 不能用来初始化char* 类型的实体”,顺从它加上const就行了。
然后介绍一下strcpy这个函数,strcpy
是一个在 C 语言中常用的标准库函数,用于复制字符串。它定义在 <string.h>
头文件中。strcpy
函数将源字符串(包括空字符 '\0')复制到目标字符串中,并返回目标字符串的指针。
函数原型:
char *strcpy(char *dest, const char *src);
参数说明:
dest
:这是目标字符串的指针,即你想要将源字符串复制到的位置。src
:这是源字符串的指针,即你想要复制的字符串。
返回值:
strcpy
函数返回一个指向目标字符串 dest
的指针。
使用 strcpy
时需要注意以下几点:
①目标缓冲区大小:目标字符串 dest
必须具有足够的空间来容纳源字符串 src
的内容,包括空字符 '\0'。否则,可能会导致缓冲区溢出,这是一个常见的安全漏洞。
②空字符复制:strcpy
会复制源字符串 src
中的所有字符,包括空字符 '\0'。这是为了确保目标字符串是一个有效的 C 字符串。
③源字符串常量性:虽然 strcpy
的 src
参数被声明为 const char *
,意味着它不应该被修改,但在实际使用中,源字符串本身并不需要是常量。
④返回值使用:虽然 strcpy
的返回值通常用于链式调用,但在实际编程中,返回值通常不被使用,因为目标字符串 dest
已经通过参数传递给了函数。
因此我们可以得出结论,这个题目想考的就是目标缓冲区的大小问题。
const char* str1 = "0123456789";最后会包含'\0',char str[10]大小不够。
正确的代码演示:
#include <iostream>
#include <string.h>
using namespace std;
void test1()
{
char str[20];
const char* str1 = "0123456789";
strcpy_s(str ,str1);
printf("Copied string: %s\r\n", str);
}
int main()
{
test1();
system("pause");
return 0;
}
输出结果: