8.4.3 字符串复制函数
在C语言中有两个复制函数,分别是strcpy函数和strncpy函数。strcpy函数的使用格式如下所示。
strcpy(字符数组名,字符串,整型表达式)
其中,“字符数组名”是已定义的字符数组;“字符串”是字符串常量或已存放字符串的字符数组名;“整型表达式”可以是任何整型表达式,此参数可以省略。
strncpy函数的使用格式如下所示:
strncpy (字符数组名,字符串,整型表达式)
其中,“字符数组名”是已定义的字符数组;“字符串”是字符串常量或已存放字符串的字符数组名;“整型表达式”可以是任何整型表达式,此参数可以省略。
上述两个格式的功能是提取“字符串”中的前“整型表达式”个字符从组成一个新的字符串,然后将这个新的字符串保存到“字符数组”中。若省略“整型表达式”,则将整个“字符串”存入字符数组中。
实例8-8
使用strcpy函数和strncpy函数复制用户输入的字符串
源码路径daima\8\8-8
拓展范例及视频二维码
范例8-8-01:复制字符串
源码路径:演练范例\8-8-01\
范例8-8-02:字符串的逆序赋值
源码路径:演练范例\8-8-02\
本实例的实现文件为“fu.c”,具体实现代码如下。
#include"string.h" #include"stdio.h" int main(void){ char str1[80], str2[80], str3[80]; //声明一个字符数组 puts("Please input the character string:"); gets(str1); //接收字符串 strcpy(str2, str1); //复制字符串 strncpy(str3, str1,4); printf("\nAfter strcpy destination=%s", str2); //输出结果 printf("\nAfter strncpy destination=%s", str3); }
程序运行后先提示用户输入一个字符串,输入完毕并按下Enter键后,会把输入的字符串分别通过strcpy函数和strncpy函数进行复制,并显示复制后的结果。如图8-8所示。
图8-8 运行结果
在具体使用strcpy函数和strncpy函数时,应该注意如下两点。
(1)对于strcpy函数来说,如果省略“整型表达式”,则会将整个“字符串”存入到字符数组中。这时需要字符数组足够长,并且在复制时它会连同字符串后的“\0”一起复制到字符数组中。
(2)对于strncpy函数来说,如果“字符串”中包含的字符少于“整型表达式”中的字符,则需要在后面加上足够数量的空字符,使复制到“字符数组名”中的总字符数为“整型表达式”中规定的字符;如果“字符串”中包含的字符多于“整型表达式”中规定的字符,则不需要在“字符数组名”的末尾加上空字符。
为加深对复制函数的理解,看下面的选择题。
问题:以下对strcpy函数的使用错误的是?
char atr1[]="string", str2[10], *str3, *str4="sting"; A.strcpy(str1, "hello"); B.strcpy(str2, "hello"); C.strcpy(str3, "hello"); D.strcpy(str4, "hello");
首先来分析下strcpy的作用。strcpy是定义在string.h中的字符串操作函数,它的原型为:
extern char *strcpy(char *dest, char *src);
其主要作用是将src指针指向的内容复制到dest的内存空间中,而src中的内容按照“\0”作为字符串的结尾来操作的。
当使用上述的strcpy函数时,也就是在将字符常量hello复制到对应的字符串空间中。
下面来分析上面的A、B、C、D选项。
A:根据str1的定义可知,它是一个初始化为“string”的数组,长度为7(strlen(str1)+1),是分配在栈上的,是在运行时可以重写的,所以对于A选项而言,strcpy是正确的,操作结果为str1中的内容为“hello”。
B:根据str2的定义可知,它是一个没有初始化的字符数组,长度为10,也是分配在栈上的,也可以修改,所以这里它也是正确的。
C:按照str3的定义可知,它是一个指针,没有指向任何地址,也就是所谓的野指针,如果对它进行操作,则有可能写入到未知的空间地址,从而导致程序崩溃,这是会出问题的,正确的写法是向堆申请空间,char *str3=(char *)malloc(10);或者让它指向某个栈上的地址,如str3=str1。
D:按照str4的定义可知,这是一个字符串常量,是分配在静态区域的,无法在运行时修改,所以不能对它进行复制。