(C语言之复习demo

tech2022-09-02  111

#include <stdio.h> /* 用户从键盘输入数据时,输入函数的处理过程 程序执行刚开始,第一次调用执行到输入函数时 (1)等待用户从键盘输入数据 (2)用户输入数据同时, 数据先被读到缓冲区 (3)计算机识别到输入结束标志,输入数据结束 (4)调用标准输入流读取缓冲区的数据保存到内存. (5)程序运行期间再次调用输入函数时,如果缓冲区有遗留数据,输入函数不会进行"等待用户输入数据"操作 (6)输入函数会直接从缓冲区读遗留数据,一直读取到缓冲区没有任何数据之后 (7)再次调用输入函数, 这时,才会有"等待用户输入数据"操作 */ int main() { /* 从键盘输入一个大写英文字母,将其转换为小写字母后,再显示到屏幕上 */ char ch; printf("请输入一个小写字符:\n"); ch = getchar();//没有参数, getchar()函数的返回值是用户输入字符的ASCII码 ch = ch + ('a' - 'A');//RSCII码表中, 所有大小写字母的ASCII码差值都是一样的. 等于32 putchar(ch);//putchar() 的参数是待打印字符,可以是一切字符,包括转义字符 /* 第二次调用getchar()函数, 执行到printf语句屏幕显示"请输入一个小写字符"后, 程序已经结束,并没有等待用户继续输入数据 */ printf("请输入一个小写字符:\n"); ch = getchar(); putchar(ch); /* CONCLUSION: (*)getchar()可以读取一切字符 (*)getchar()输入结束标志为回车符(正常输入一个字符后,按回车,输入的字符和回车符都会被读到缓冲区) (*)每次调用只可以读取一个字符 (*)如果输入多个字符或者正常输入一个字符, 那么其他字符会继续留在输入缓存区,等待后续的输入函数来读取 直到缓冲区中的字符(包括回车)全部读完后,才会等待用户按键,只要缓冲区有字符就不会等待用户的按键操作 */ return 0; } #include <stdio.h> /* 2020年9月5日 续--- 2020年9月5日 之前总结了字符输入函数 getchar() 处理字符的过程及结论. 今天以下将总结的是: 一、scanf() %c格式字符 输入字符时存在的问题. 二、c%格式符存在问题的解决方法. */ /* Emphasis: scanf()输入数值型数据时, 遇到以下几种情况都认为输入数据结束: (1)遇到空格符、回车符、制表符; (2)达到输入域宽;(关于域宽可以看 我的"C语言之复习demo_07") (3)遇非法字符输入; 注:scanf()函数输入数据结束时按的回车符会遗留在缓冲区. */ /* scanf() %c格式字符 输入字符时存在的问题 程序1 按如下数据输入格式,从键盘输入一个整数加法算式: 操作数 1 + 操作数 2 然后计算并输出该表达式的计算结果,输出格式如下: 操作数 1 + 操作数 2 = 计算结果 */ int data1, data2; char op; printf("please enter the expression data1+data2\n"); /* Emphasis:操作具体步骤为:(例:键盘输入12、空格、加号、空格、3、回车) */ scanf_s("%d%c%d", &data1, &op, &data2); printf("%d%c%d = %d\n", data1, op, data2, data1 + data2); /* (VS2019中执行结果): please enter the expression data1+data2 12 + 3 12 -858993460 = -858993448 (CodeBlocks中执行结果): please enter the expression data1+data2 12 + 3 12 8 = 20 为什么是这样一个结果? (1) 第一步输入过程: 输入的数据是 数值12、空格、加号、空格、数值3、回车字符(代表了缓冲区有六个数据) (2) 第二步读取过程:(输入完数据后按回车键开始) (*)%d开始读取整数 12被读取成功没有问题, 屏幕显示12 (*)%c开始读取字符数据 发现空格字符,读取空格字符,屏幕显示空格 (*)%d开始读取整数数据, 但是这时候%d能读取的是 字符+号, scanf函数读取%d格式数据时,如果遇到空白字符,会自动忽略,但是遇到了除空白 符以外的非法字符,则判断读取结束。---很明显,上面的操作中,scanf函数按顺序 读取到第二个%d格式数据时,缓冲区排位可供读取的数据时字符+号,判断到非法字符 scanf()函数自动判断读取第二个%d这个数据项的操作已经结束。 实际上也就意味并没有任何数据被读取保存到变量data2中。 也就造成了变量data2中是垃圾值的状况。屏幕输出验证了这一点。 注---空格符、回车符、制表符(也是空白符) (*)如果之后读取的数据项总是数值型数据(即在scanf中对应的格式符), 不会把空白符当作有效数据读入,读取时也作为分隔符,忽略读取. (*)如果之后读取的数据项有字符型数据,任何空白符都会被当做有效 数据读入到字符型变量中. 注---遇非法字符输入 (*)如读取到与格式控制字符相违背的非法字符,整个scanf函数就读取结束了,嗝屁了, 无论后面是否还有多少数据项待被读取. */ /* scanf() %c格式字符 输入字符时存在的问题 程序2 编程从键盘先后输入int型,char型,float型数据, 要求每输入一个数据就显示出这个数据的类型和数据值 */ int a; char b; float c; printf("please input an integer:"); scanf_s("%d", &a); printf("integer: %d\n", a); printf("please input a character:"); scanf_s("%c", &b); printf("character: %c\n", b); printf("please input a float number:"); scanf_s("%f", &c); printf("float: %f\n", c); /* 程序运行: please input an integer:3 integer: 3 please input a character:character: please input a float number:3.5 float: 3.500000 显然程序2也和程序1一样,在输入数据3之后,输入的回车符被当做有效字符读给字符型变量b了 */ /* c%格式符存在问题的解决方法 1 */ int a; char b; float c; printf("please input an integer:"); scanf_s("%d", &a); printf("integer: %d\n", a); getchar();/*将存于缓存取的回车符读入,避免在后面作为有效字符读入*/ printf("please input a character:"); scanf_s("%c", &b); printf("character: %c\n", b); printf("please input a float number:"); scanf_s("%f", &c); printf("float: %f\n", c); /* c%格式符存在问题的解决方法 2 */ int a; char b; float c; printf("please input an integer:"); scanf_s("%d", &a); printf("integer: %d\n", a); printf("please input a character:"); scanf_s(" %c", &b);/*在%c 前面加一个空格,将存于缓冲区中的回车符读入*/ printf("character: %c\n", b); printf("please input a float number:"); scanf_s("%f", &c); printf("float: %f\n", c); /* Emphasis: 函数scanf()的格式控制字符串在除格式说明符以外的其他字符, 那么这些字符必须在输入数据时,由用户从键盘原样输入.---C语言规定按格式读取 这说明什么, 在scanf中除格式说明符以外的其他字符 是必须从键盘上接受读入的字符, 并作为专门格式字符串的读入需求 和scanf中匹配读到格式字符时候, 就得读取到相应的值是一个道理. */ int a; char b; scanf("%d", &a);//输入a,回车,scanf读取到非法字符,结束读取,缓冲区有字符a, 和一个回车字符 printf("%d\n", a);//输出一个垃圾值 scanf("a %c", &b);//a空格 不需要用户按规格输入了, 因为缓冲区已经有了. 所以这时直接输入一个字符 printf("%c\n", b); /* a 88 c c */ return 0; } 未完待续---------------字符串处理仍有一组函数 及scanf %s 格式符用法
最新回复(0)