c语言学习——缓冲区与字符操作

输出缓冲区:

当我们使用标准库的输出系列函数打印数据到屏幕,数据并不会立即显示到屏幕上,而先存储到一块内存中,我们把这块内存称为输出缓冲区,等满足相关条件后,再从缓冲区中显示到屏幕,相关条件有:

1、从输出状态切换到输入状态。

2、缓冲区满了,1k=1024个字节,系统会把缓冲区中所有数据一起显示到屏幕了。

3、程序结束时,系统会把缓冲区中所有数据一起显示到屏幕了。

4、遇到'\n'时,'\n'前面的数据会立即显示到屏幕上。

5、调用fflush(stdout) 强制

输入缓冲区:

当我们从终端输入数据给程序时,系统并没有立即把数据交给程序读取,而先存储到了一块内存中,我们这块内存称为输入缓冲区,直到我们按下Enter键时,系统才会把缓冲区中的数据给程序读取。

当我们输入的数据过多,或者类型不匹配,标准的输入系列函数就会读取失败,或只读取一部分,剩余的数据就会残留缓冲区中,影响后续数据的输入,当我们发现这情况情况后,应先清理输入缓冲区,后续的数据才能正常输入,清理输入缓冲区的方法有:

刷新,会把立即缓冲区中所有数据一起显示到屏幕了。

方法1:
while('\n' != getch());

方法2:
scanf("%*[^\n]");
scanf("%*c");

方法3:
stdin->_IO_read_ptr = stdin->_IO_read_end;

注意:
    1、如果输入缓冲区中没有垃圾数据,使用方法1与方法2需要你手动输入一些垃圾数据,程序才能继续执行。
    2、方法3只能在Linux系统下使用。

字符

什么是字符:

字符就是符号或图案,但在计算机中以整数形式存在,当需要显示时,会根据ASCII表中的对应关系显示出相应的符号或图案。

在C语言中使用char类型的变量存储字符的ASCII码值,也就是使用整数进行模拟字符,标准的ASCII码表的范围是:0~127,共128个字符,其他的语种,使用-128~-1进行设计字符编码,比如中文的汉字,使用的是2~3字节存储一个汉字。

需要记住的最要几个字符

‘\0’  0

'0'    48

'A'   65

'a'   97

当先输入数值型数据(整数形、浮点型),再输入字符型数据时,前一次的输入会残留一个'\n'或空格,影响字符型数据的输入,有以下三种解决方法。

方法1:增加一个空白的字符输入语句。
scanf("%*c");
getchar();

方法2:在%c的前面增加一个空格
scanf(" %c");

方法3:修改输入缓冲区
stdin->_IO_read_ptr = stdin->_IO_read_end;

判断字符类型的函数:

函数名函数功能
isalnum()当字母或数字字符时, 返回真值
isalpha()当字母字符时, 返回真值
iscntrl()当控制字符时, 返回真值
isdigit()当数字字符时, 返回真值
isgraph()当非空格可打印字符时, 返回真值
islower()当小写字母字符时, 返回真值
isprint()当可打印字符时, 返回真值
ispunct()当标点字符时, 返回真值
isspace()当空格字符时, 返回真值
isupper()当大写字母字符时, 返回真值
isxdigit()当十六进制字符时, 返回真值

串型结构:

由若干个相同类型的数据组成顺序表(数组),在数据的末尾有一个结束标志,在使用这种数组时,可以不关心数组的长度。

字符串:

什么是字符串:

由字符类型组成的串型结构,它的结束标志是'\0',使用它可以存储单词、句子、文章、汉字等更丰富的信息,一般使用char类型的数组存储。

字符串字面值:

1、"由双引号包括着的若干个字符"

2、它是以常量字符数组的形式存在,末尾隐藏着一个'\0'。

3、它们会被存储在text内存段,一旦强行修改就会出现段错误。

4、使用指针指向字符串字面值时,一定要用const加以保护,防止出现段错误,宁可出现编译时的错误,也不要出现运行时的错误。

5、编译器会优化它的存储,相同的字符串字面值,只会存储一份在text内存段中。

6、最常用的是用它给字符数组初始化,char arr[] = "hello" 编译器会自动拷贝字符串到数组的内存中(包括'\0'),完成初始化就有了两份字符串存储在内存中,一份存储在stack、data,另一份还存储在text。

注意:使用字符串字面值给字符数组赋值,只能在定义字符数组时使用,这是编译器帮忙完成拷贝的,在完成字符数组的定义后,只能使用strcpy函数对字符串进行赋值。

字符串的输出:
printf("%s",字符串的首地址);
puts(字符串的首地址); // 输出完字符串后会再输出一个\n
字符串的输入:

scanf("%s",存储字符串的首地址);
缺点:不能输入带空格的字符串

char *gets(char *s);
缺点:从终端读取数据,直到遇到\n,它不关心存储字符串的空间有多大,所以可能产生段错误、脏数据,官方不建议使用该函数。

char *fgets(char *s, int size, FILE *stream);
功能:从指定的文件中读取不超过size-1个字符(它会为'\0'预留位置)。
stream:数据的来源,写stdin即可
缺点1:如果输入的字符不足size-1个,它会连'\n'一起读入。
缺点2:如果输入的字符超过size-1个,fgets只会从输入缓冲区中读取size个字符,剩余的数据会残留输入缓冲区中影响后续数据的输入。

char* get_str(char* str,size_t size)
{
    assert(NULL != str);
    size_t len = strlen(fgets(str,size,stdin));
    
    if('\n' == str[len-1])
        str[len-1] = '\0';
    else
        while('\n' != getchar());
    return str;
}

操作字符串的常用函数:

size_t strlen(const char *s);
功能:计算字符串的长度,不包括'\0'

assert(NULL != str);

    const char* tmp = str;
    while(*tmp++);
    
    return tmp-str-1;

char *strcpy(char *dest, const char *src);
功能:把字符串src拷贝到dest处

assert(NULL != dest && NULL != src);

    char* tmp = dest;
    while(*tmp++ = *src++);
    
    return dest;

int strcmp(const char *s1, const char *s2);
功能:按字典序比较两个字符串

assert(NULL != s1 && NULL != s2);
    while(*s1 == *s2 && *s1)
        s1++,s2++;

    if(*s1 > *s2)
        return 1;
    if(*s1 < *s2)
        return -1;
    return 0;

char *strcat(char *dest, const char *src);
功能:把src字符串追加到dest的末尾

assert(NULL != dest && NULL != src);

    char* tmp = dest;
    while(*++tmp);
    while(*tmp++ = *src++);
    
    return dest;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值