|
15鱼币
本帖最后由 人中仙 于 2021-2-6 20:59 编辑
在逛鱼C论坛时看到鱼油发了一个求助帖,原帖应该已经解决了,暂时没找到。但是,在解决该问题过程中发现printf、scanf有些反常的地方,具体问题已经在代码片段的注释中给出。
注:两个源码的区别只有11、12行的scanf和printf。输出图片中,绿色字符为输入的字符,黑色字符为输出的字符。
源码1,scanf("\n%c",&Temp)的情况,输出见附图1:
- /*
- * 功能:输入是三行,每行是一个0-9的数字;打印输出也是三行,每行对应于数字0-9的大写字母A-J;
- */
- #include <stdio.h>
- int main() {
- int iaInputNumber[3]; //存放输入的三个整数
- char temp = 0;
- for (int i = 0; i < 3; ++i) { //依次获取三个0-9之间的数字
- scanf("\n%c", &temp); //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的无效的输入,这是为什么?
- printf("%d ",temp); //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?
- iaInputNumber[i] = (int)temp-'0'; //stdin的值放入数组
- }
- for (int i = 0; i < 3; ++i) { //循环输出
- printf("%c\n", 'A' + iaInputNumber[i]);
- }
- return (0);
- }
复制代码
图1:源码1的输出错位,数字后面应该有的一个空格跑到下一行去了
图1:输出错位
源码2,scanf("%c\n",&Temp)的情况,输出见附图2:
- /*
- * 功能:输入是三行,每行是一个0-9的数字;打印输出也是三行,每行对应于数字0-9的大写字母A-J;
- */
- #include <stdio.h>
- int main() {
- int iaInputNumber[3]; //存放输入的三个整数
- char temp = 0;
- for (int i = 0; i < 3; ++i) { //依次获取三个0-9之间的数字
- scanf("%c\n", &temp); //此时会要求额外的输入?
- printf("%d ",temp); //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?
- iaInputNumber[i] = (int)temp-'0'; //stdin的值放入数组
- }
- for (int i = 0; i < 3; ++i) { //循环输出
- printf("%c\n", 'A' + iaInputNumber[i]);
- }
- return (0);
- }
复制代码
图2:源码2的输出,字符错位,而且循环3次却要求输入4个字符
图2:要求额外的输入
|
|