《C和指针》笔记(九)

(九)字符串、字符和字节

C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。字符串常量很适用于那些程序不会对它们进行修改的字符串。

NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节。

char *strcpy(char *dst, char const *src);
这个函数把参数src字符串复制到dst参数。由于dst参数将进行修改,所以它必须是个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量。
即使新的字符串比dst原先的内存更短,由于新字符串是以NUL字节结尾,所以老字符串最后剩余的几个字符也会被有效地删除。
如果字符串比数组长,多余地字符仍被复制,它们将覆盖原先存储于数组后面的内存空间的值。

char *strncpy(char *dst, char const *src, size_t len);
char *strncat(char *dst,char const *src, size_t len);
int strncmp(char const *s1, char const *s2, size_t len);

这些函数接受一个显式的长度参数,用于限定进行复制或比较的字符数。

如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。注意!它的结果将不会以NUL字节结尾。
所以要在代码中确保字符串是以NUL结尾的。

char buffer[BSIZE];
...
strncpy(buffer, name, BSIZE);
buffer[BSIZE - 1] = '\0';

strncat总是在结果字符串后面添加一个NUL字节,而且它不会像strncpy那样对目标数组用NUL字节进行填充。

字符串查找

查找一个字符:

char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);

ch包含了一个字符值。
strchr在字符串str中查找字符ch第1次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针。
strrchr的功能和strchr基本一致,只是它所返回的是一个指向字符串中该字符最后一次出现的位置。

char *strpbrk(char const *str, char const *group);

这个函数返回一个指向str中第1个匹配group中任何一个字符的字符位置。

char *strstr(char const *s1, char const *s2);

这个函数在s1中查找整个s2第1次出现的起始位置,并返回一个指向该位置的指针。

高级字符串查找

size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);

group字符串指定一个或多个字符。strspn返回str起始部分匹配group中任意字符的字符数。
strcspn对str字符串起始部分中不与group中任何字符匹配的字符进行计数。

char *strtok(char *str, char const *sep);

sep参数是个字符串,定义了用作分隔符的字符集合。第1参数指定一个字符串,它包含零个或多个由sep字符串中一个或多个分隔符分隔的标记。strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。

void print_tokens(char *line)
{
    static char whitespace[] = " \t\f\r\v\n";
    char *token;
    
    for(token = strtok(line, whitespace)); token != NULL; token = strtok(NULL, whitespace))
        printf("Next token is %s\n", token);
}

如果strtok函数的第1个参数不是NULL,函数将找到字符串的第1个标记。strtok同时将保存它在字符串中的位置。如果strtok函数的第1个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始像前面一样查找下一个标记。如果字符串内不存在更多的标记,strtok函数就返回一个NULL指针。

内存操作

void *memcpy(void *dst, void const *src, size_t length);
void *memmove(void *dst, void const *src, size_t length);
void *memcmp(void const *a, void const *b, size_t length);
void *memchr(void const *a, int ch, size_t length);
void *memset(void *a, int ch, size_t length);

和strn带头的函数不同,它们在遇到NUL字节时并不会停止操作。

memcpy从src的起始位置复制length个字节到dst的内存起始位置。

memmove的行为和memcpy差不多,只是它的源和目标操作数可以重叠。

memcmp对两段内存length个字节的内容进行比较。

memchr从a的起始位置开始查找字符ch第1次出现的位置。

memset函数把从a开始的length个字节都设置为字符值ch。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言指针C语言非常重要的概念,它是程序设计最基本的数据结构之一。指针可以用于在程序访问和操作内存的数据,它们是C语言最强大、最灵活的工具之一。在本篇笔记,我们将介绍C语言指针的基本概念和用法。 1. 指针的概念 指针是一个变量,它存储了一个内存地址。在C语言,每个变量都有一个内存地址,指针可以用来指向这个地址。通过指针,我们可以访问和操作内存的数据,这使得C语言非常灵活和强大。 2. 定义指针变量 在C语言,定义指针变量有两个步骤。第一步是声明指针变量的类型,第二步是用"&"符号取得一个变量的地址,并将这个地址赋给指针变量。例如: ```c int num = 10; //定义一个整型变量num int *p; //声明一个指针变量p p = # //将num的地址赋给指针变量p ``` 这样,指针变量p就指向了变量num的地址。 3. 操作指针变量 有了指针变量之后,我们可以通过指针变量访问和操作内存的数据。例如,要访问变量num的值,可以通过指针变量p来实现: ```c printf("num的值为:%d", *p); //输出num的值 ``` 在这个例子,通过"*"符号来访问指针所指向的内存存储的值。这个符号被称为“解引用符号”,它可以用来访问指针所指向的内存存储的值。 4. 指针的运算 指针可以进行加、减运算,这种运算是基于指针的类型和指针所指向的内存的大小进行的。例如,如果定义了一个指向整型的指针变量p,那么p+1将指向下一个整型变量的地址。同样的,p-1将指向上一个整型变量的地址。 此外,指针还可以用来访问数组的元素。例如: ```c int arr[5] = {1, 2, 3, 4, 5}; //定义一个整型数组 int *p; //声明一个指针变量 p = arr; //将数组的首地址赋给指针变量 printf("arr[0]的值为:%d", *p); //输出数组第一个元素的值 ``` 在这个例子,将数组的首地址赋给了指针变量p,然后通过解引用符号来访问数组的元素。 5. 指针的应用 指针C语言非常重要的概念,它可以用于很多方面。例如,可以通过指针来动态分配内存空间、访问硬件设备、实现复杂的数据结构等等。 总之,指针C语言非常重要的概念,程序员需要深入理解它的概念和用法,才能够在程序设计发挥其强大的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值