C语言教程(十五)字符串

1. 简介

C语言中,是没有单独的字符串类型的,它使用一维的字符数组来表示,即char str[20];的形式,并且以转义字符\0结尾,表示一个字符串的结束。

同其他数组一样,字符数组创建后,编译器也会为其分配一段连续的内存,然后在字符数组的结尾加上\0的字节,不用知道字符串的长度,通常使用\0字符就能知道字符串在哪里结束。

2. 字符串变量声明

字符串变量声明也就是字符数组的声明,由于字符数组的末尾加上了\0字符,所以字符数组的大小比实际的字符多一个。

char str[20] = {'a','b','c'};
//加上\0字符后
char str[20] = {'a','b','c','\0'};

上面的示例中声明了一个字符数组,这种写法很繁琐且不推荐,通常使用双引号“”这种形式出现。

char str[20] = {'a','b','c','\0'};
//等同于
char str[20] = "abc";

如果要声明的字符串过长需要写到下一行,可以通过反斜杠\来换行,或者通过合并多个字符串。

//通过反斜杠\换行
char str[20] = "abcdef\
ghijklmn";
//合并字符串
char str[20] = "abcdef"
"ghijk"
"lmn";

如果不指定字符数组的长度,编译器会自动计算字符数组的长度;如果小于字符数组的实际长度,编译器会报错;如果大于字符数组的实际长度,剩余的字符全都被初始化为0。

//不指定长度,自动计算
char str[] = "abcde";
//指定的字符数组长度小于实际长度
char str[5] = "abcde";//加上\0,实际长度为6
//指定的字符数组长度大于实际长度
char str[20] = "abcde";//后面空出来的位置都会初始化为0

字符串变量也可以声明为指针,指向字符数组。

char *str = "abcde";//声明为字符指针

之前在常量中的一节中说过,字符指针形式的字符串是常量类型,因此定义后就不能修改。

chr *str = "abcde";
str[0] = 'q';//常量值,错误

char str[] = "abcde";
str[0] = 'q';//可以修改

但是字符指针变量可以指向其他的字符串,而字符数组不可以指向其他的字符串。

char *str = "abcde";
str = "fghij";//正确

char str[] = "abcde";
str = "fghij";//错误,数组名就是字符串的首地址

3. 常用函数(API)

C语言中也提供了处理字符串的标准库,通常定义在<string.h>头文件中。

3.1 strlen()

strlen()函数接受一个字符串参数,用于返回该字符串的长度,注意不包含末尾的空字符\0。返回值是一个size_t类型的无符号整数。

size_t strlen(const char* s);//函数原型

#include <string.h>  //引入字符串库文件
#include <stdio.h>

int main(void){
   char *str = "abcde";
   printf("字符串的长度为%zd\n",strlen(str));
}

3.2 strcpy()与strncpy()

strcpy()函数用于将一个字符串的内容复制到另一个字符串中,函数的原型如下。

char* strcpy(char dest[], const char source[])

strcpy()函数可以接受两个参数,第一个参数是目的字符串数组,它的长度不能小于第二个参数,否则会发生越界;第二个参数是源字符串数组,它是const修饰的,所以不会修改,返回值是一个字符串指针char*,指向第一个参数。

#include <string.h>  //引入字符串库文件
#include <stdio.h>

int main(void){
   char str1[] = "abcde";
   char str2[10];
   strcpy(str2,str1);//将str1的内容复制到str2
   printf("%s\n",str1);//输出abcde
   printf("%s\n",str2);//输出abcde
}

上面的示例中使用strcpy()函数将字符串str1复制到字符串str2,复制过后,源字符串不变。

strcpy()函数还可以用于对字符数组的赋值操作。

char str[20];
strcpy(str, "abcde");

为了防止目的字符串越界溢出,C语言提供了strncpy()函数,它比strcpy()函数多了一个参数。该函数的第三个参数规定了复制的最大字符数n。如果复制达到了n,字符串还没有复制完,就会停止复制;如果源字符串的字符小于n,则strncpy()函数和strcpy()函数的功能完全一致。该函数的原型如下。

char* strncpy(char* dest, char* src, size_t n);

注意,这里复制过去的字符串不包含空字符\0,strncpy()函数还可以用于复制指定的字符串。

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

int main(void){
   
   char str1[20] = "abcdefg";
   char str2[50];

   strncpy(str2, str1, 3);
   str2[3] = '\0';//手动加上\0

   printf("%s\n", str2); // abc
}

上面的示例中,strncpy()函数复制了3个字符到字符串str2,注意复制完后在str2后面手动添加空字符\0。所以这就意味着复制的最大字符n是str2的长度减1。

3.3 strcat()与strncat()

strcat()函数用于将两个字符串拼接到一起,该函数的原型如下。

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

strcat()函数接受两个参数s1和s2,用于将第二个参数的字符串s2添加到第一个参数s1的末尾,第二个参数的字符串不会改变。该函数返回值是一个字符指针,指向第一个参数。

char s1[10] = "abc";
char s2[5] = "def";

strcat(s1, s2);
printf("%s\n",s1);//abcdef

上面的示例中,strcat()函数将s1和s2拼接在一起,所以s1就变成了abcdef。注意第一个参数的长度必须大于第二个参数的长度,否则会发生越界行为。

和strncpy()函数一样,C语言提供了strncat()函数,它比strcat()函数多了一个参数。该函数的第三个参数规定了添加的最大字符数n。如果添加的字符达到了n,字符串还没有添加完,就会停止添加;如果源字符串的字符小于n,则strncat()函数和strcat()函数的功能完全一致。该函数的原型如下。

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

注意这里的strncat()函数会在目的字符串结尾自动添加上空字符\0。

3.4 strcmp()与strncmp()

strcmp()函数用于比较两个字符串的内容,该函数位于头文件<string.h>中,原型如下。

int strcmp(const char* s1, const char* s2);

strcmp()函数接受两个参数s1,s2,这两个参数都是只读的、不可修改的,只能用于比较。返回值是一个int类型的整数,如果两个字符串的内容完全相同(根据ASCII码排序),则返回0;如果s1小于s2,返回一个负数;如果s1大于s2,返回一个正数。

#include <string.h>

int main(void){
  char *s1 = "abc";
  char *s2 = "abc";
  
  strcmp(s1, s2);//返回0
}

strncmp()函数比strcmp()函数多了一个参数,该参数用于指定比较的字符数,原型如下。

int strncmp(const char* s1,const char* s2, size_t n);

除了参数以外,返回值、还有基本的功能都是一样的。

#include <string.h>

int main(void){
  char *s1 = "abcdef";
  char *s2 = "abcdef";
  
  strcmp(s1, s2,3);//比较前3个字符,返回0
}

3.5 strchr()

strchr()函数用于在某个字符串中查找首次出现的指定字符,函数原型如下。

char *strchr(const char *str, int c);

该函数接受两个参数,第一个参数是指定的字符串指针,它是只读的、不可修改的,第二个参数是指定的字符c,返回类型是一个指向该字符的指针,如果没有找到该字符c,则返回NULL。

#include <string.h>

int main(void){
  char *str = "abcdef";
  char c = 'c';
  
  strchr(str,c);//返回cdef
}

觉得有帮助可以赞赏本文哦~万分感谢!
文章:C语言教程(十五)字符串
作者:沛旗
链接:https://www.peiqiblog.com/article/3314/
版权声明::本博客站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议
转载请注明文章地址及作者哦~
暂无评论

发送评论(禁止发表一切违反法律法规的敏感言论) 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇