目录
一、思路
二、调用函数
三、例子
一、思路
给定字符串 string_buf[1024] = "12345678",把这个字符串分成 3 段 a, b, c 并分别截取 a, b, c, ab, ac, bc 这六种情况段字符串。
string_buf[1024] = "12345678"
"12" "345" "678"
a b c
截取通过内存拷贝来实现。
二、调用函数
memcpy()
memset()
void *memcpy(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
利用 strncpy( ) 也可以实现字符串裁剪,不过需要新建一个字符串数组存放这些数据,memset( ) 与 strncpy( ) 类似但有些区别。
另外 strtok( ) 函数也可以实现裁剪功能,不过是按照分隔符来裁剪的,本文不涉及这种情况。
三、实现
1⃣️ 分别截取 a, b, c 这三种情况有点类似,只以截取 b 为例子
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char string_buf[1024] = "12345678";
printf("%s\n", string_buf);
//只要 b 不要 a c
memcpy(string_buf, string_buf+2, sizeof(string_buf)-2);
printf("%s\n", string_buf);
memset(string_buf+3, 0, sizeof(string_buf)-3);
printf("%s\n", string_buf);
return 0;
}
结果如下:
$ gcc exam.c
$ ./a.out
12345678
345678
345
2⃣️截取 ab,不要 c
ab 字符串部分往后清零即可
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char string_buf[1024] = "12345678";
//划定 a 12, b 345, c 678
printf("%s\n", string_buf);
//只要 a b,不要 c
memset(string_buf + 5, 0, sizeof(string_buf) - 5);
printf("%s\n", string_buf);
return 0;
}
结果如下:
$ gcc exam.c
$ ./a.out
12345678
12345
3⃣️截取 bc,不要 a
bc 字符串往左移 a 字符串的长度,移动完毕后,bc 后的内容清零。
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char string_buf[1024] = "12345678";
//划定 a 12, b 345, c 678
printf("%s\n", string_buf);
memcpy(string_buf, string_buf+2, sizeof(string_buf)-2);
printf("%s\n", string_buf);
memset(string_buf + 6, 0, sizeof(string_buf)-6);
printf("%s\n", string_buf);
return 0;
}
结果如下:
pi@raspberrypi:~/turfShare/mysqlFiles/test_project $ ./a.out
12345678
345678
345678
4⃣️截取 ac,不要 b
只需要 c 左移 b 字符串的长度,左移完成后,ac 后的内容清零。
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char string_buf[1024] = "12345678";
//划定 a 12, b 345, c 678
printf("%s\n", string_buf);
//只要 ac,不要 b
memcpy(string_buf+2, string_buf+5, sizeof(string_buf)-3);
printf("%s\n", string_buf);
memset(string_buf + 5, 0, sizeof(string_buf)-5);
printf("%s\n", string_buf);
return 0;
}
结果如下:
$ gcc exam.c
$ ./a.out
12345678
12678
12678
结论:实现字符串的裁剪本质上是内存的拷贝