0%

字符串复习

字符串

基本概念

字符串是位于双引号中的字符序列,因此在内存中以“\0”结束,所占字节比实际多一个。

(‘\0’是字符串结束的标志,因此数组中没有‘\0’时只是字符数组,且元素中间不能出现’\0’)

初始化

当数组元素个数大于存储字符内容时, 未被初始化的部分默认值是0。

1
2
3
 char name[] = "c\0ool";
printf("name = %s\n",name);
//输出结果: c
  • 注意点:
    • 对一个字符串数组, 如果不做初始化赋值, 必须指定数组长度;
    • 字符串数组最后一个字符的位置要留给字符串的结尾标示‘\0’;
    • 当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。

正确的赋值方法:

1
2
3
4
5
6
char str[10]="string";

char str[]="string";

char str[10];
scanf("%s",&str);//或scanf("%s",str);

错误的赋值方法:

1
2
char str[10];
str="string"; //这是因为数组名是一个地址常量,是不可被赋值的

※常用函数※

使用字符串函数应包含头文件”string.h”

(1)输出函数

  • 格式: puts(字符数组名)
  • 功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。

  • 优点:

    • 自动换行;
    • 可以是数组的任意元素地址。
  • 缺点
    • 不能自定义输出格式
1
2
char ch[] = "dhk";
puts(ch); //输出结果: dhk
  • 当使用printf且输出格式为&s时,输出项直接为数组名,而不是数组元素

    1
    2
    3
    char s[10]="dhk";
    printf("%s",s);//正确
    printf("%s",s[0]);//错误

(2)输入函数

  • 格式: gets (字符数组名)
  • 功能:从标准输入设备键盘上输入一个字符串。

当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。

  • 若要使用scanf一个字符串类型,则需要注意scanf会自动把空格当作分隔符

(3)计算长度

1.sizeof()

数值包含’\0’,且当对象为字符串数组时,计算的是整个数组分配空间的长度

2.strlen()

测量字符串实际长度,不包含;\0’。

(4)连接函数

  • 格式: strcat(字符数组名1,字符数组名2) /strncat(~,~,num);
  • 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字符数组1的首地址

(5)比较函数

  • 格式: strcmp(字符数组名1,字符数组名2)

  • 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

    • 字符串1=字符串2,返回值=0;
    • 字符串1>字符串2,返回值1;
    • 字符串1<字符串2,返回值-1。

    需要注意的是,比较顺序是从左至右依次比较每一个字符的ASCII码大小,只要出现不同字符就只按照当前字符大小比较,与之后字符大小就无关了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <string.h>
    int main(){
    char str1[10] ="acb";
    char str2[10] ="abc";
    printf("%d\n", strcmp(str1,str2));
    //输出1,由于'c'>'b',与第三个及以后的字符大小无关
    return 0;
    }

    感觉不是很好用,就拿来比较是否相同就行。

(6)拷贝函数

  • 格式: strcpy(char dest,char src); / strncpy(char dest,const char src,size_t num);
  • 功能:将参数src字符串拷贝至参数dest所指的地址。
  • 返回值:返回参数dest的字符串起始地址。
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
int main(){
char str1[10] ="aaaaaa";
char str2[10] = "bbb";
strncpy(str1,str2,2);
printf("%s\n", str1); //结果为"bbaaaa"
//当num长度大于srt2中字符串长度时仅会打印bbb(结果可能与编译器相关)
return 0;
}

strcpy会覆盖原来的整个字符串,而strncpy只会覆盖n个字节原来的字符串,剩下的保留(当n超长时应该是默认使用strcpy)

(7)检索函数

1. char strstr(const char str,const char* substr)

  • 功能:检索子串在字符串中首次出现的位置

  • 返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。

    2. char strchr(const char str,char c)

  • 功能:查找字符串中第一次出现c的位置。

  • 返回值:规律同strstr()。

    3. char strrchr(const char str,char c)

  • 功能:查找字符串中最后一次出现c的位置。

  • 返回值:同上。

(8)其余函数

字符转换

1
2
int tolower(int c):转化字符为小写字母; 
int toupper(int c):转化字符为大写字母;

整型转换

1
int atoi(const char* str)

​ 返回转换后的整型数。

字符串大小写转换

1
2
strlwr(const char* str);//转小写
strupr(const char* str);//转大写