字符串
字符:
字符是在计算机中以整数形式存储的,在需要显示成字符时会根据ASCII表中对应的关系,来显示对应的符号或图案
'\0' 0 空字符
'0' 48
'A' 65
'a' 97
串:
是一种数据结构,是由一组连续的若干个类型相同的数据组成,末尾有一个结束标志
对于这种数据结构的处理都是批量性的,从开始位置一直到结束标志才停止
字符串:
由字符组成的串型结构,结束标志是'\0'
字符串的存在形式:
字符数组:
char str[10] = {'a','b','c'};
由char类型组成的数组,记得为'\0'预留位置
使用的是栈内存,字符内容可以修改
字符串字面值:
"由双引号包含的若干个字符"
在末尾隐藏了一个'\0'
字符串字面值是以地址形式存在的,存储在代码段,如果强制修改字符串字面值或产生段错误
注意:相同的字符串字面值,在代码段中只会存在一份
常用形式:
字符数组[] = "字符串字面值";
char str[] = "hehe";
会自动在末尾补'\0'
注意:有两份一模一样的字符串,一份存在在代码段,另一份存储在栈内存中,因此栈内存中的可以修改
注
字符串的输入:
scanf %s 地址
自动在末尾添加'\0'
缺点:不能输入带空格的字符串,只能接收空格前面的字符串
char *gets(char *s);
功能:输入一个字符串
s:把要输入的字符串存储到s,可以接收带空格的字符串
返回值:返回s,作为链式调用
注意:gets接受字符串时不会检查长度,有越界的风险,所以编译器会产生使用警告
char *fgets(char *s, int size, FILE *stream);
fgets(str,10,stdin);
功能:输入size-1个字符的字符串
注意:
1、如果输入超过size-1个字符,会只保留前size-1个,并且会自动在末尾添加'\0'
2、如果输入不足size-1个字符,最后输入的'\n'也会接收成功后才结束
字符串的输出
printf %s 地址
int puts(const char *s);
功能:输出一个字符串
注意:会自动在末尾打印'\n'
输出缓冲区
缓冲区机制:
1、为了节约程序运行时间
2、为了平衡高速设备与低速设备之间的时间
程序要显示的数据内容不会立即显示到屏幕上,而是先存储到输出缓冲区中,当满足一定条件时,才会从输出缓冲区中显示到屏幕上
条件:
1、遇到'\n'
2、遇到输入语句
3、当输出缓冲区满4k
4、当程序结束时
5、fflush(stdout) 手动刷新
输入缓冲区
程序并不会直接从键盘接收输入的数据,而是当按下回车键后,先存储输入缓冲区中,然后程序才会从输入缓冲区读取数据
可能导致的后果:
1、当要读取的是整型或浮点型数据时,而输入缓冲区中的数据是字母或符号,此时会读取失败,并且该数据会继续残留在输入缓冲区中,影响了接下来的所有数据的读取
解决:根据scanf的返回值,判断是否需要清理缓冲区后重新输入,直到输入成功为止
2、虽然fgets可以指定读取size-1个字符,但是如果输入超过size-1个,多出的字符会残留在输入缓冲区中,会影响下面的输入语句
解决方法1:
先判断缓冲区是否有残留,如果有则清理
scanf("%[^ \n]");
// 读取任意类型数据并丢弃,直到遇到'\n'停止
scanf("%c")
// 读取任意字符并丢弃
解决方法2:
清理输入缓冲区,但是只适合Linux操作系统
stdin->_IO_read_ptr = stdin->_IO_read_end;
3、先输入整数或浮点数数据,再输入字符\字符串时,'\n'会残留在输入缓冲区中,就会影响字符\字符串的输入
解决:在%c前面加空格
scanf(" %c",&ch);