字符串:
字符:
在计算机中字符是以整数形式存储的,当需要显示时
根据ASCII表中的对应关系显示出相应的符号或图案
‘\0’ 0
‘0’ 48
‘A’ 65
‘a’ 97
串:
是一种数据结构,是由一组连续的相同类型若干个数据组成,末尾有结束标志
对这种数据结构进行处理都是批量性处理,从开头位置到结束标志为止
字符串:
有字符组成的串形结构,它的结束标志是’\0’
字符串的输入:
scanf %c
scanf %s 地址
注意:不能接收空格
char *gets(char *s);
功能:输入字符串,可以接受空格
返回值:链式调用(把一个函数的返回值,作为另一个函数的参数)
char fgets(char s,int size,stdin);
功能:可以设置输入的字符串的长度为size-1,超出长度时会在末尾给’\0’预留位置,
超出部分会不接收
注意:如果长度不足size-1,则会接收最后输入的’\n’
字符串的输出:
printf %s 地址
int put(const char *s)
功能:输出一个字符串,会在末尾自动打印一个’\n’
返回值:成功输出的字符个数
字符串的存在形式:
字符数组: char str[10] = {‘a’,‘b’,‘c’,…};
由char类型组成的数组,一定要为’\0’预留位置
赋值麻烦
使用的时栈内存,数据是可以修改的
字符串字面值:
“由双引号包含的若干个字符”“hello world”
在末尾隐藏了一个’\0’
字符串字面值就是以地址形式存在的,数据存储在代码段,如果修改则会产生段错误
char* str = “字符串字面值”;
sizeof(“strstr”) 结果= 字符个数+1
两个一模一样的字符串字面值在代码段中只会存在一份
常用方式:字符数组[] = “字符串字面值”;
会自动给’\0’预留位置
赋值完成后字符串会存在由两份,一份存储在代码段,一份存储在栈内存(可以修改)
输出缓冲区:
程序输出的数据并不会立即显示到屏幕上,而实现存储在输出缓冲区,
只有满足一定条件时才会显示到屏幕上
1、遇到\n后
2、当遇到输入语句时,也会立刻刷新缓冲区
3、程序结束时
4、当缓冲区满4k时
5、手动刷新 fflush(stdout)
缓冲区机制可以提高数据的读写速度,并且可以让低俗的输入输出设备
与高速的CPU能够
协调工作
输入缓冲区:
程序并不会立即获取屏幕上输入的数据,而是按下回车键时程序才会输入缓冲区中读取数据
1、当要读取的是整型或者浮点型数据时,而缓冲区中的数据是字母或符号时,此时读取失败,
数据会残留在输入缓冲区中,就会影响接下来的数据的读取
解决1方法:
只要判断scanf的返回值
2、fgets可以指定读取size-1个字节,如果超出范围,则多余的字符会残留在输入缓冲区
中,会影响接下来的数据的读取
解决2方法:
必须确保缓冲区中有垃圾数据,否则程序会停下来等待接收一个\n
因此可以在清理缓冲区前,判断str末尾是不是\n,是则不用清理,否则需要
清理
1、scanf("%*[^\n]"); 表示从缓冲区中读取并丢弃身居,只要不是\n就一直
丢弃,遇到\n停止
scanf("%*c"); 从缓冲区中读取并丢弃一个字符数据,也就是丢弃剩余的\n
2、stdin->IO_read_pet = stdin->_IO_read_end;
只能在Linux系统上使用,把缓冲区的当前位置指针移动到缓冲区末尾,相当于清理缓冲区
3、当先输入的是 整形或者浮点型时,再输入字符、字符串时会读取到上一次最后输入的残留
的’\n’,会影响字符、字符串的输入
注意:scanf("%s",str) 不会影响字符串的输入
gets(str) 残留的\n会影响字符串的输入
解决3方法:scanf(" %c",%ch);%c前面加空格
字符串的常用操作:
#include(string.h)
size_t strlen(const char *s);
功能:计算字符串长度,结果不包括’\0’ 对比sizeof
char *strcpy(char *dest,const char *src)
功能:把src拷贝到dest,相当于给dest赋值
返回值:dest的首地址,链式调用
char *strncpy(char *dest,const char *src,size_t n);
只拷贝前n个字符
char *strcat(char *dest,const char *src);
功能:把src追加到dest的末尾, 相当于+=
返回值:dest的首地址,链式调用
char *strncat(char *dest, const char *src,size_t n);
只追加前n个数
int strcmp(const char *s1, const char *s2);
功能:比较s1与s2两个字符串,按照字典序比较,谁在前谁小,比较出结果立即返回
返回值:
s1 > s2 正数
s1 == s2 0
s1 < s2 负数
int strncmp(const char *s1, const char *s2, size_t n);
功能:只比较前n个字符
int atoi(const char *nptr);
功能:字符串转int类型
long atol(const char *nptr);
功能:字符串转long类型
long long atoll(const char *nptr);
功能:字符串转long long类型
double atof(const char *nptr);
功能:字符串转duoble型
char *strstr(const char *haystack,const char *needle);
功能:查找haystack中是否存在neele
返回值:如果存在,则返回needle第一次在haystack中的出现的位置,如找不到返回NULL
char *strchr(const char *s,int c);
功能:查找字符串s中是否存在字符c
返回值:如果存在返回c第一次在s中出现的位置,不存在返回NULL
int sprintf(char *str,const char *format,...);
功能:把各种类型的数组输入到str中
返回值:字符串str的长度
int sscnaf(const char *str,const char *format,...);
功能:从str中解析出各种类型数据
void *memcpy(void *dest,const void *src,size_t n);
功能:从src拷贝n个字节到data中
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较两个内存块,按字节比较
返回值:
s1>s2 正数
s1=s2 0
s1<s2 负数