什么是字符串
由于字符组成的串型数据结构,以'\0'作为结束标志。
字符串为什么重要:
我们看到的都是字符型数据,而计算机只能针对数值型数据进行运算,因此我们需要非常频繁的把数据转换成字符串,字符串转换成数据。
字符串存在的形式:
1.字符数组:
char arr[5] = {'h','e','l','l','o'}; // error
char arr[6] = {'h','e','l','l','o'};
一般存储在栈,也可以存储在堆。
注意:为'\0'预留位置!!!
2.字符串字面值:"由双绰号包括的若干个字符" char* str1 ="hehe"; printf("%s\n",str1);
1、以地址存在,const char* str。必须使用指针指向
2、它存储在只读段|代码段,不能修改,否则会产生段错误。
3、自带'\0';
一般情况都使用字符串字面值来初始化字符数组,编译器会把只读段中的字符串拷贝一份到栈,并且包括'\0'。
char str[]="hehe";
字符串的输出:
printf %s 字符串首地址
puts 字符串首地址,不需要占位符,自动换行。
putchar 显示一个字符
fprintf(stdout,"%s","hehe");
字符串的输入:
scanf %s 不能输入带空格的字符串
gets 不检查字符串的长度,可能会造成段错误
fgets 可以指定接收的字符串长度,实际只能接收size-1 字符,它会为'\0'预留一个位置,
当输入的字符数不足size-1 时会边回车符一起接收。可能输入缓冲区会残留数据。
字符串的操作:
C语言中没有处理字符串的语句,只能使用标准库中所提供的函数进行操作。
string.h
strlen 计算字符串的长度,不包括'\0'
strcpy 字符串拷贝,使用字符串字面值给字符数组赋值只能在定义时使用,之后的赋值必须使用strcpy函数。
strcat 在str1后追加str2,连接
strcmp 按照字典序比较两个字符串,
str1 > str2 结果为1
str1 < str2 结果为-1
str1 = str2 结果为0
atoi/atol/atoll 字符串转换为整数
strstr 返回str2在str1中首次出现的位置,如果返回空表示不存在。
memset/memcpy(内存拷贝)/strchr
sprintf/sscanf(用于拼接/解析字符串)