C和指针 第九章 字符串 字符 字节

时间:2023-01-11 17:26:37

C语言中没有字符串类型,字符串是以NUL结尾的字符数组组成的。

高级字符串查找:

//计算字符串起始部分,有多少字符是在group中
size_t strspn(char const * str, char const *group);
//不在group中
size_t strcspn(char const * str, char const *group);

  示例:

#include <stdio.h>
#include <string.h>

int main()
{
char str[] = "abababcccccccccccc";
printf("%lu\n", strspn(str, "ab"));
printf("%lu\n", strcspn(str, "b"));

return 0;
}

输出6 和 1

//sep
char * strpok(char * str, char const *sep);
示例:
#include <stdio.h>
#include <string.h>

int main()
{
char str1[] = {"yangyangyangyangyangyangyang"};
char str2[strlen(str1)];
strcpy(str2, str1);
char *token;
char sep[2] = "g";

for(token = strtok(str2, sep); token != NULL; token = strtok(NULL, sep)){
printf("%s ", token);
}
printf("\n");
printf("str1 %s\n", str1);
printf("str2 %s\n", str2);

return 0;
}

strtok的第一个参数不是NULL,函数将查找到字符串中的第一个标记。strtok同时保存它在字符串中的位置,如果第一个参数是NULL,函数就在同一个字符串中保存的位置开始像前面一样查找下一个标记,如果没有更多标记返回NULL,否则返回字符串指针。strtok会修改字符串。

C和指针 第九章 字符串 字符 字节

内存操作函数:

由于字符串是\0字符结尾的,如果字符串内有NUL那么就需要使用内存操作函数。

//从src开始的位置拷贝length个字节到dst内存起始位置
void *memcpy(void *dst, void const *src, size_t length);

//memmove和memcpy差不多,源和目的地可以重叠,memmove先把源拷贝到临时位置,然后再拷贝回来
void *memmove(void *dst, void const *src, size_t length);

//memcmp,和memchr分别是比较和查找
void *memcmp(void *dst, void const *src, size_t length);
void *memchr(void *dst, void const *src, size_t length);

//memset将从src开始的length个字符设置成ch
void *memset(void *src, int ch, size_t length);

 函数中参数类型都是void *,任何类型都可以转换成void *.

#include <stdio.h>
#include <string.h>


int main()
{
char str[100];
memset(str, 'a', 99);
str[100] = '\0';
printf("%s\n", str);

return 0;
}

运行结果: 

 C和指针 第九章 字符串 字符 字节