------------------------------------------
输出缓冲区:
程序并不会立即把输出的数据显示到屏幕上,而是先存储在输出缓冲区中,当满足一定条件时
才显示出来
1、遇到\n (缓冲区内容也会刷新到屏幕上)
2、程序结束时
3、遇到输入语句时
4、当缓冲区满4K时
5、fflush(stdout) 手动刷新(Linux系统有用)
输入缓冲区:
程序并不会立即获取屏幕上输入的数据,而是按下回车键后程序才从输入缓冲区读取数据
缓冲区机制:
1、可以提高数据的读写速度
2、可以让低速的输入输出设备与高速的CPU之间协调工作
缓冲区常见问题:
1、当需要读取的是整型或者浮点型时,而输入缓冲区中的数据是字符或符号时,
此时读取会失败,数据会残留在输入缓冲区中,就会影响接下来的所有数据的读取
解决方法: 借助scanf返回值判断是否接收成功,如果接收过程有失败情况,
可以先清理输入缓冲区,再重新循环直到接收成功为止
int a = 0,b = 0,c = 0;
while(3 > scanf("%d%d%d",&a,&b,&c))
{
printf("输入数据有误,请重新输入:");
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
printf("%d%d%d",a,b,c);
2、fgets可以指定读取size-1个字符,如果有多余的会残留在输入缓冲区中,影响下一次输入
必须确认输入缓冲区中有垃圾数据时,才能去读取丢弃输入缓冲区的垃圾数据,
否则程序会停下来等待缓冲区中有\n
解决方法一:
int len = 0;
while(str[len]) len++;
if('\n' != str[len-1])
{
scanf("%*[^\n]"); /*表示从缓冲区中接收任意字符并丢弃,
只要不是\n就一直进行,遇到\n才停下*/
scanf("%*c"); //丢弃任意字符,把\n丢掉
}
解决方法二:
借助缓冲区的位置指针移动到缓冲区的末尾实现清理缓冲区的效果
(只能在Linux系统下使用)
stdin->_IO_read_ptr = stdin->_IO_read_end;
3、当先输入整型、浮点型数据,再紧接着输入字符、字符串时,前一次残留的'\n'或空格,
会影响字符、字符串的输入
解决方法: %c前面加空格
scanf(" %c",&ch)
字符串相关的常用操作: (写函数重构)
//#include <string.h>
strlen
size_t strlen(const char *s);
功能: 计算字符串的长度,不包括'\0'
注意: sizeof 和 strlen 的区别
strcpy
char *strcpy(char *dest,const char *src);
功能: 把src拷贝到dest,相当于给dest赋值
返回值: 返回dest,链式调用
char *strncpy(char *dest,const char *src,size_t n);
功能: 把src前n个字符拷贝到dest
strcat
char *strcat(char *dest,const char *src);
功能: 把字符串src追加到dest的后面
返回值: 返回dest,链式调用
char *strncat(char *dest,const char *src,size_t n);
功能: 把src前n个字符追到到dest的后面
strcmp
int strcmp(const char *s1,const char *s2);
功能: 比较两个字符串的大小,按照字典序比较,谁在前面谁小,只要比较出结果,
立即返回,后面的不再比较
返回值:
s1 > s2 返回正数
s1 < s2 返回负数
s1 == s2 返回0
int strncmp(const char *s1,const char *s2,size_t n);
功能: 比较前n个字符的大小
(重要)//练习: 自己写函数重构实现strlen\strcpy\strcat\strcmp
//#include <stdlib.h>
atoi
int atoi(const char* nptr);
功能: 字符串转int类型
atol
long atol(const char* nptr);
功能: 字符串转long类型
atoll
long long atoll(const char* nptr);
功能: 字符串转long long类型
atof
double atof(const char* nptr);
功能: 字符串转double类型
//#include <string.h>
strstr
char* strstr(const char* haystack,const char* needle);
功能: 查找haystack,是否存在needle
返回值: needle首次在haystack中首次出现的位置(从出现的位置开始printf),
如果找不到返回NULL
strchr
char* strchr(const char* s,int c);
功能: 查找s中是否有字符c
返回值: c在s中首次出现的位置,不存在返回NULL
//#include <stdio.h>
sprintf(字符串拼接)
int sprintf(char* str,const char* format, ...);
功能: 把各种类型数据输出到str中
返回值: 拼接后str的长度(字符长度)
sscanf(解析字符串)
int sscanf(const char* str,const char* format, ...);
功能: 从str中读取解析各种类型的数据
返回值: 成功读取到的变量的个数
通讯录:
记录50个人
姓名、性别、电话
功能:
1、按1添加联系人
2、按2根据名字删除联系人
3、按3根据名字修改联系人
4、查找联系人,根据姓名、电话(支持模糊查找)
5、显示所有联系人信息