12.12 字符串专题 字符串的相关函数和注意事项

发布于 2024-12-12  92 次阅读


1. strlen

size_t strlen(const char *str);
  • 功能:计算字符串 str 的长度(不包括结束符 '\0'
  • 返回值:返回字符串的长度,返回类型为size_t类型(一种无符号整型)
  • 注意事项:str[strlen(str)]存储的就是字符结束符

对应strlen而言,如果strlen返回n,那么实际占用字节数应该是n+1(\0的存在也占用一个字节)

但是实际长度仍然是n,因为字符串的长度通常不包括空字符('\0'

2. strcpy

char *strcpy(char *dest, const char *src);
  • 功能:将源字符串 src 复制到目标字符串 dest
  • 返回值:返回目标字符串 dest 的指针
  • 注意事项:strcpy会将 src 字符串的所有字符(包括结束符 '\0')复制到 dest 中,从而覆盖 dest 原有的内容

首先明确未定义行为:如果你试图在字符串操作中访问 '\0' 之后的字符,可能会导致未定义行为,因为字符串默认是以 '\0' 结尾的。访问这些字符可能会导致程序崩溃或产生意外结果

对于strcpy而言,dest原来存储的字符(包括\0)将会被逐个逐个地替换,直到src的\0被替换完为止

如果dest长度大于src,dest剩余的部分不会被清空或修改,仍然保留了调用 strcpy 之前的内容。但这可能导致未定义的行为,如上所述

3. strncpy

char *strncpy(char *dest, const char *src, size_t n);
  • 功能:将源字符串 src 的前 n 个字符复制到目标字符串 dest
  • 返回值:返回目标字符串 dest 的指针

strncpy 从 src 开始逐字符复制到 dest直到复制了 n 个字符

如果src的长度小于n,那么复制完src后dest后面将填充足够数量的'\0'以确保达到n个字符

假设源字符串是 "abc",长度为 3,n 为 5
结果是:dest = "abc\0\0"

如果src的长度大于或等于 nstrncpy 将只复制前 n 个字符,并不会在目标字符串的末尾添加 '\0'。这意味着目标字符串可能不是以 '\0' 结尾的有效 C 字符串


接下来跳过strcat

5. strncat

char *strncat(char *dest, const char *src, size_t n);
  • 功能:将src 的前 n 个字符追加到目标字符串 dest 的末尾(从dest的\0开始,\0也将被覆盖)
  • 返回值:返回目标字符串 dest 的指针
  • 如果 src 的长度小于 nstrncat 会将整个 src 字符串复制到 dest,并在末尾添加 '\0'
  • 如果 src 的长度大于或等于 n,则只会复制 n 个字符,并在 dest 的末尾添加 '\0'

6. strncmp

和strcmp类似

7. strchr

char *strchr(const char *str, int c);
//c:要查找的字符,注意它是以 int 类型传递,但实际上是一个字符
  • 功能:查找字符 c 在字符串 str 中第一次出现的位置
  • 返回值:返回指向该字符的指针,如果未找到则返回 NULL
int main() {
char ch[100] = "asdfg";
char a= 'f';
printf("%d",strchr(ch,a) - ch);
return 0;
}

切记,不要写成char a[10]= 'f';

单字符,如果用字符数组表示就用不了strchr了

做减法,返回的是f里ch数组中第一次出现的下标值

8. strrchr

char *strrchr(const char *str, int c);
  • 功能:查找字符 c 在字符串 str 中最后一次出现的位置
  • 返回值:返回指向该字符的指针,如果未找到则返回 NULL

0. strstr

char *strstr(const char *haystack, const char *needle);
  • 功能:查找字符串 needle 在字符串 haystack 中第一次出现的位置
  • 返回值返回指向该位置的指针,如果未找到则返回 NULL
int main() {
char ch[100] = "asdfg";
char a[10] = "df";
printf("%d", strstr(ch, a)-ch);
return 0;
}

strstr(ch, a)-ch

两个指针做减法,strstr(ch,a)还大些,所以是它减ch


注意:前面的返回类型都是指针!所以是地址,那么做减法才能得到对应的下标值


字符串要注意的事项:

字符数组str[某]=“\0”而不是单引号

str[某][某]='\0'而不是双引号

字符串的比较用strcmp或者strcmp,而不是==和!=

!= 和==运算符比较的是指针的地址,而不是字符串的内容只有在单字符比较时才可用(这时等价于具体的变量,此时[]相当于解引用)

//如果两种相等为if语句判断条件,用!strcmp(a,b)

届ける言葉を今は育ててる
最后更新于 2024-12-24