【C语言】字符串,补充:单引号和双引号, const和define, 常量指针和指针常量 您所在的位置:网站首页 c语言常量变量占不占用存储单元 【C语言】字符串,补充:单引号和双引号, const和define, 常量指针和指针常量

【C语言】字符串,补充:单引号和双引号, const和define, 常量指针和指针常量

2024-07-10 00:05| 来源: 网络整理| 查看: 265

【C语言】字符串:一串数据类型为字符(char)的数组(字符数组),结束符是'\0'。

一个字符占一个字节的内存,结束符'\0'也占一个字节的内存。

结束符 '\0' :缩写NUL,空字符。表示字符串的结束。

NULL:空指针。定义在标准库中的值为零的常量。

字符串名就是内存地址,也是第一个字符的内存地址。也可以理解为字符串是指针,指向字符数组。

单个字符:用单引号,例如:'a',  '\0'。

空字符串或多个字符组成的字符串:用双引号,例如:"good"。

操作字符串(字符数组)的标准库为string.h。

#include

0、字符串变量

数组:char 变量名[字符数量] = 字符串;    【字符数量可省略,字符数量包括结束符'\0'】

指针:char *指针变量名;

// 字符数组 char s[6] = "hello"; // 5个字符 + 1个结束符'\0' char s[6] = {'h','e','l','l','o','\0'}; // 单个字符,用单引号 // 指针变量 char *s; s = "hello";

1、strlen, sizeof

strlen:字符串共有多少个字符(不包括结束符'\0')。

sizeof:字符串共占多少字节内存(包括结束符'\0')。

#include #include int main(void) { char strings[] = "hello"; int number = strlen(strings); int size = sizeof(strings); printf("strings: \"%s\" has %d elements, memory size is %d bytes",strings, number, size); return 0; } // 结果为: strings: "hello" has 5 elements, memory size is 6 bytes

2、memchr,strchar,strrchr  搜索字符串中的字符

memchr:void *memchr(const void *str, int c, size_t n)

参数:str是指定内存区域,c为要搜索的字符(单个字符,需用单引号),n为要搜索的字节数(指定搜索的内存大小)。

返回:指针,指向第一次出现的字符c的内存地址。若没有,返回NULL。

strchar:char *strchr(const char *str, int c)

参数:str是字符串,c为要搜索的字符(单个字符,需用单引号)。

返回:指针,指向第一次出现的字符c的内存地址。若没有,返回NULL。

strrchr:char *strrchr(const char *str, int c)

参数:str是字符串,c为要搜索的字符(单个字符,需用单引号)。

返回:指针,指向最后一次出现的字符c的内存地址。若没有,返回NULL。

 memchr, strchar,strrchr基本用法相同:

1、都可以在字符串中搜索字符。

2、都返回指针,指向搜索到的字符的内存地址。若没有搜索到,返回NULL。

 memchr, strchar,strrchr的区别是:

1、memchr有3个参数:指定内存区域,搜索的字符,搜索的字节数。

      strchar和strrchr只有2个参数:字符串,搜索的字符。

2、memchr和strchr返回的指针都指向第一次出现字符c的内存地址。

     strrchr返回的指针是指向最后一次出现字符c的内存地址。

3、memchr指定搜索的内存大小。

      strchar和strrchr都是字符串结束(结束符'\0')就停止搜索。

4、memchr可以搜索任意内存区域的字节。

      strchar和strrchr专门搜索字符串中的字符。

// 以 memchr 为例 #include #include int main(void) { const char strings[] = "hello"; char *s; s = (char *)memchr(strings, 'l', strlen(strings)); printf("strings=\"%s\", the first \"l\" location is %d\n",strings, s-strings+1); printf("strings=\"%s\", from the first \"l\" to the end are \"%s\"",strings, s); return 0; } // 结果为: strings="hello", the first "l" location is 3 strings="hello", from the first "l" to the end are "llo"

补充:strstr (字符串中查找子字符串)

strstr:char *strstr(const char *haystack, const char *needle)

在字符串haystack查找子字符串needle。

返回:若找到,返回指针,指向haystack中第一次出现needle的内存地址。若没有,返回NULL。

#include #include int main(void) { char strings[] = "hello world wow"; char *s; s = strstr(strings, "world"); // 找到子字符串 printf("s point to \"%s\"\n",s); return 0; } // 结果为: s point to "world wow" #include #include int main(void) { char strings[] = "hello world wow"; char *s; s = strstr(strings, "good"); // 没有找到子字符串 printf("s point to \"%s\"\n",s); return 0; } // 结果为: s point to "(null)"

3、memcpy,memmove,strcpy,strncpy 复制字符串

memcpy:void *memcpy(void *dest, const void *src, size_t n)

参数:dest是存储复制内容的内存区域(目标字符串),src是要复制的数据源(内存区域),n是复制的字节数。

返回:指针,指向目标字符串。

注意:

memcpy是内存复制,可复制任意类型的数据源。

memcpy指定复制内存大小。不会自动添加结束符'\0'。注意目标字符串中是否有结束符。若没有,需一个字节的内存空间手动添加结束符'\0'。

若目标字符串的内存不够大,可能缓冲区溢出。注意边界检查。

 memmove: void *memmove(void *dest, const void *src, size_t n)

参数:dest是存储复制内容的内存区域(目标字符串),src是要复制的字符串,n是要复制的字节数。

返回:指针,指向目标字符串。

注意:

没有重叠的内存区域时,与memcpy功能相同。

有重叠的内存区域时,复制前会将重叠部分拷贝到目标区域,复制后,源区域的内容会被修改。

// 以 memcpy 为例 #include #include int main(void) { char s[] = "hello"; // 数据源“hello”(5个字符+1个结束符'\0') char strings[8]; memcpy(strings,s,strlen(s)+1); // 复制字符串(包括结束符'\0') printf("strings = \"%s\",strings[5] = %p\n",strings, strings[5]); return 0; } // 结果为: strings = "hello",strings[5] = 0000000000000000

strcpy:char *strcpy(char *dest, const char *src)

参数:dest是存储复制内容的内存区域(目标字符串),src是要复制的字符串。

返回:指针,指向目标字符串。

注意:

strcpy专门复制字符串,包括结束符'\0'。依赖结束符'\0'来确定复制的终点,注意要复制的字符串需有正确的结束符。

若没有正确的结束符或目标字符串的内存不够,可能缓冲区溢出。注意边界检查。

#include #include int main(void) { char strings[6]; // char strings[5]; // warning: '__builtin_memcpy' writing 6 bytes into a region of size 5 overflows the destination [-Wstringop-overflow=] strcpy(strings,"hello"); // 复制字符串 printf("strings = \"%s\"",strings); return 0; } // 结果为: strings = "hello"

strncpy:char *strncpy(char *dest, const char *src, size_t n)

参数:dest是存储复制内容的内存区域(目标字符串),src是要复制的字符串,n是复制的字节数。

返回:指针,指向目标字符串。

注意:

strncpy指定复制内存大小。

要复制的字符串若小于指定复制的内存大小,则自动填充结束符'\0'。

要复制的字符串若大于等于指定复制的内存大小,则可能需要一个字节的内存空间手动添加结束符'\0',若复制的内容中有结束符,则无需手动添加。

若目标字符串的内存不够大,可能缓冲区溢出。注意边界检查。

#include #include int main(void) { char strings[8]; strncpy(strings,"hello",8); // strings 内存存储为:h e l l o \0 \0 \0 printf("strings = \"%s\"",strings); return 0; } // 结果为: strings = "hello" #include #include int main(void) { char strings[6]; strncpy(strings,"hello",6); // 无需手动添加结束符,复制内容中已包含 printf("strings = \"%s\"",strings); return 0; } // 结果为: strings = "hello" #include #include int main(void) { char strings[6]; strncpy(strings,"helloworld",5); // 复制原字符串的一部分内容(不包括结束符) strings[5] = '\0'; // 手动添加结束符 printf("strings = \"%s\"",strings); return 0; } // 结果为: strings = "hello" memcpy,strcpy,strncpy的区别 memcpystrcpystrncpy3个参数:目标字符串,要复制的数据源,复制内存大小2个参数:目标字符串,要复制的字符串3个参数:目标字符串,要复制的字符串,复制内存大小复制内存区域,可复制任意类型的数据源(包括字符串)专门复制字符串专门复制字符串指定复制的内存大小从要复制的字符串开始到结束符(包括结束符\0)指定复制的内存大小

目标字符串中可能手动添加结束符'\0'

注意要复制的字符串中需有正确的结束符'\0'目标字符串中可能手动添加结束符'\0'确保目标字符串的内存足够大确保目标字符串的内存足够大确保目标字符串的内存足够大

补充:memset (将某内存区域设置为指定值)

memset:void *memset(void *str, int c, size_t n)

参数:str是存储填充内容的内存区域(目标字符串),c是指定要填充的内容(单个字符,需单引号),n是填充的字节数。

返回:指针,指向目标字符串。

注意:

memset是将指定字符填充到指定内存区域的前n个字节。

用于快速初始化大块内存,或清空内存,或为内存赋值。

memset不做边界检查,需确保目标字符串的内存区域足够大。

#include #include int main(void) { char strings[8] = "hihello"; printf("Before: strings = %s\n", strings); memset(strings, '#', 2); // 将字符数组前2个字符设为'#' printf("After: strings = %s\n", strings); memset(strings, '\0', sizeof(strings)); // 将字符数组清零,使用'\0'代替0 printf("End: strings = %s\n", strings); return 0; } // 结果为: Before: strings = hihello After: strings = ##hello End: strings =

4、strcat,strncat 字符串结尾追加内容

注意:确保目标字符串的内存区域必须足够大,能够容纳追加的内容。

从目标字符串的结束符'\0'开始追加,'\0'被第一个追加的字符替换,追加完会加上结束符'\0'。

strcat:char *strcat(char *dest, const char *src)

参数:dest是目标字符串,src是要追加的内容。

返回:指针,指向目标字符串。

#include #include int main(void) { char strings[16] = "hello"; printf("Before: strings = %s\n", strings); strcat(strings, "world"); // 追加内容 printf("After: strings = %s\n", strings); return 0; } // 结果为: Before: strings = hello After: strings = helloworld

strncat:char *strncat(char *dest, const char *src, size_t n)

参数:dest是目标字符串,src是要追加的内容,n是追加的字节数。

返回:指针,指向目标字符串。

#include #include int main(void) { char strings[16] = "hello"; printf("Before: strings = %s\n", strings); strncat(strings, "world", sizeof("world")); // 追加内容(指定字节数) printf("After: strings = %s\n", strings); return 0; } // 结果为: Before: strings = hello After: strings = helloworld

5、memcmp,strcmp,strncmp  比较字符串

memcmp: int memcmp(const void *str1, const void *str2, size_t n)

将两个内存区域str1和str2的前n个字节数进行比较。

返回:若str1>str2,返回值>0;若str1=str2,返回值=0;若str10;若str1=str2,返回值=0;若str10;若str1=str2,返回值=0;若str10;str1=str2,返回值=0;str1



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有