#include <stdio.h>
#define LENGTH 128
char* str_copy(char *p, const char *s){
char *t = p;
while (*p++ = *s++){
}
return t;
}
int main(void){
char str[LENGTH] = "";
char tmp[LENGTH];
printf("str = \"%s\"\n", str);
puts("请输入要复制的字符串:");
scanf("%s", tmp);
str_copy(str, tmp);
puts("将 tmp 复制给 str 后:");
printf("str = \"%s\"\n", str);
return 0;
}
运行结果:
- 通过 *p = *s 进行赋值
首先进行的是 *p = *s 的赋值。指针 s 指向的字符会被赋值给指针 d 指向的字符。 - 指针 p 和 s 递增
赋值结束后, p 和 s 递增。指针 p 和 s 分别指向了下一个字符。
函数开始执行时,指针 s 指向字符串 tmp 的第一个字符,指针 p 指向字符串 str 的第一个字符串。 - 只要 s 指向的字符不是 null 字符,就将 s 指向的字符赋给 p 指向的字符,然后使 p 和 s 递增,再处理下一个字符。
当赋给 *p 的字符为 null 字符时,while语句的循环就结束了。
也可将str_copy 函数
char* str_copy(char *p, const char *s){
char *t = p;
while (*p++ = *s++){
}
return t;
}
换成如下函数
char* str_copy(char *p, const char *s){
int i = 0;
char *t = p;
while (p[i] = s[i]){
i++;
}
return t;
}
p[i] 和 s[i] 分别是 *(p + i) 和 * (s + i),即访问指针p 和 s 所指向的字符之后第 i 个字符的表达式。为了访问指针所指元素后第 i 个字符,分别对指针 p 和 s 进行了两种运算。
两个函数进行对比
while (*p++ = *s++)
- 不需要用于下标的变量 i ,可以节约少量内存。
- 运行效率有望更高。
如果将
char str[LENGTH] = "";
换成
char *str = "";
会导致程序运行异常。
注:
不要改写字符串字面量,也不要对超过字符串字面量的内存空间进行写入操作。
str_copy(str, tmp);
puts("将 tmp 复制给 str 后:");
printf("str = \"%s\"\n", str);
可以简写成:
puts("将 tmp 复制给 str 后:");
printf("str = \"%s\"\n", str_copy(str, tmp));
首先将字符串 tmp 复制到字符串 str,然后再将复制后的 str 显示出来。
传入printf 函数的正是“指向复制后的字符串的第一个字符的指针”。
使用strcpy函数复制字符串
头文件 | 原型 | 说明 | 返回值 |
---|---|---|---|
#include<string.h> | char *strcpy(char *s1, const char *s2) | 将s2指向的字符串复制到s1指向的数组中。若s1和s2指向的内存空间重叠,则作未定义处理。 | 返回s1的值。 |
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "";
char *p = "vvcat";
printf("复制后str = \"%s\"", strcpy(str, p));
return 0;
}
strcpy函数的实现
char *strcpy(char *s1, const char *s2){
char *tmp = s1;
while (*s1++ = *s2++){
}
return tmp;
}
strncpy函数控制字符串复制的个数
头文件 | 原型 | 说明 | 返回值 |
---|---|---|---|
#include<string.h> | char *strncpy(char *s1, const char *s2, size_t n) | 将s2指向的字符串复制到s1指向的数组中。若s2的长度大于等于n,则复制到第n个字符为止。否则用null字符填充剩余部分。若s1和s2指向的内存空间重叠,则作未定义处理。 | 返回s1的值。 |
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "";
char *p = "vvcat";
printf("复制后str = \"%s\"", strncpy(str, p, 4));
return 0;
}
运行结果:
strncpy函数的实现
char *strncpy(char *s1, const char *s2, size_t n){
char *tmp = s1;
while (n){
if (!(*s1++ = *s2++)){
break;
}
n--;
}
while (n--){
*s1++ = '\0';
}
return tmp;
}