11.22
输入缓冲区:
程序并不会立即获取键盘上输入的数据,当按下回车键程序才会从输入缓冲区中读取数据
1.当读取整型或者浮点型数据时,而如果此时缓冲区中的数据是字母或符号时,此时会读取失败,数据会继续残留在缓冲区中,就会影响接下来的所有数据的读取
解决方法:
判断scanf的返回值,如果返回值小于要接受的变量的个数,则先清空输入缓冲区,再重新scanf接收,直到全部成功接收为止
2.fgets可以指定读取size-1个字符,如果有超出部分会残留在输入缓冲区中,也影响接下来的输入
解决方法:
1.必须确定缓冲区中有残留数据,否则程序会停下来等待一个\n (看封装代码)
scanf ("%*[^\n]"); 表示从缓冲区中接收任意字符并丢弃,知道遇到\n才停止
scanf ("%*c") 丢弃最后残留的\nint len = 0;
while(str[len]) len++;
if (str[len-1] != '\n')
{
scanf ("%*[^\n]");
scanf ("%*c");
}
2.把输入缓冲区的当前位置指针移动到缓冲区末尾,相当于清理输入缓冲区,但只能在linux系统下使用
stdin->_IO_read_ptr = stdin->_IO_read_end;
3.如果先输入整型,浮点型数据,再输入字符,字符串时,前一次输入的\n会被残留在输入缓冲区,就会影响下面字符,字符串的输入
注意:scanf不影响字符串的输入,但gets影响
解决方法:
1.scanf(" %c",&ch); %c前面加空格
2.gets(str)前面加 scanf("%*c")在缓冲区中读取任意字符并丢弃
字符串相关常用函数:
#include <string.h>
size_t strlen(const char *s)
功能:计算字符串长度 结果不包括'\0'
char *strcpy(char *dest, const char *src);
功能:把src拷贝给dest,相当于给dest赋值 dest = src
返回值:dest的首地址(链式调用)
char *strcat(char *dest, const char *src);
功能:把src追加到dest的末尾,相当于给dest +=
返回值:dest的首地址(链式调用)
int strcmp(const char *s1, const char *s2);
功能:比较两个字符串大小,按照字典序比较,谁在前面谁小,一旦比较后出结果后,后面的字符不再比较
返回值:
s1 > s2 正数
s1 < s2 负数
s1 == s2 0
char *strncpy(char *dest, const char *src, size_t n);
功能:把src前n个字符拷贝给dest
char *strncat(char *dest, const char *src, size_t n);
功能:把src前n个字符追加到dest的末尾
int strncmp(const char *s1, const char *s2, size_t n);
功能:只比较前n个字符
作业:自己实现四个string字符串处理函数
#include <stdio.h>
int len(const char* str)
{
const char *temp = str;
while(*temp) temp++;
return temp - str;
}
char* cpy(char* str,const char* str1)
{
char* temp = str;
while(*temp++ = *str1++);
return str;
}
char* cat(char* str,const char* str1)
{
char *temp = str;
while(*temp) temp++;
while(*temp++ = *str1++);
return str;
}
int cmp(const char* str,const char* str1)
{
while(*str && *str == *str1) str++,str1++;
if (*str == *str1)
return 0;
if (*str > *str1)
return 1;
else
return -1;
}
int main(int argc,const char* argv[])
{
char str[256] = "hello";
//fgets(str,10,stdin);
printf ("%d\n",len("abcd"));
printf ("%s\n",cpy(str,"aaa"));
printf ("%s\n",cat(str,"bbb"));
printf ("%d\n",cmp("bbc","bc"));
}
int atoi(const char *nptr);
功能:字符串转int类型 "123" --> 123
long atol(const char *nptr);
功能:字符串转long类型
long long atoll(const char *nptr);
功能:字符串转long long类型
char *strstr(const char *haystack, const char *needle);
功能:查找haystack中是否存在needle
返回值:存在时,返回needle在haystack中第一次出现的位置,如果不存在时,返回NULL
char *strchr(const char *s, int c);
功能:查找字符串s中是否有字符c
返回值:返回c在s中第一次出现的位置,找不到返回NULL
int sprintf(char *str, const char *format, ...);
功能:可以把各种类型的数据输出到字符串中
返回值:字符串str的长度
int sscanf(const char *str, const char *format, ...);
功能:从字符串中解析各种类型的数据
返回值:成功读取到的变量个数
void *memcpy(void *dest, const void *src, size_t n);
功能:从src内存位置拷贝n个字节到dest内存位置
返回值:dest首地址
int memcpy(void *dest, const void *src, size_t n);
功能:比较两个内存是否相等,按字节比较,比较前n个字节
返回值:
s1 > s2 正数
s1 < s2 负数
s1 == s2 0
void *memmove(void *dest, const void *src, size_t n);
功能:移动src到dest中,就算有重合部分,也不影响正确性