C语言中scanf();printf();函数使用的问题
本帖最后由 人中仙 于 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; //存放输入的三个整数
char temp = 0;
for (int i = 0; i < 3; ++i) { //依次获取三个0-9之间的数字
scanf("\n%c", &temp); //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的无效的输入,这是为什么?
printf("%d ",temp); //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?
iaInputNumber = (int)temp-'0';//stdin的值放入数组
}
for (int i = 0; i < 3; ++i) { //循环输出
printf("%c\n", 'A' + iaInputNumber);
}
return (0);
}
图1:源码1的输出错位,数字后面应该有的一个空格跑到下一行去了
源码2,scanf("%c\n",&Temp)的情况,输出见附图2:
/*
* 功能:输入是三行,每行是一个0-9的数字;打印输出也是三行,每行对应于数字0-9的大写字母A-J;
*/
#include <stdio.h>
int main() {
int iaInputNumber; //存放输入的三个整数
char temp = 0;
for (int i = 0; i < 3; ++i) { //依次获取三个0-9之间的数字
scanf("%c\n", &temp); //此时会要求额外的输入?
printf("%d ",temp); //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?
iaInputNumber = (int)temp-'0';//stdin的值放入数组
}
for (int i = 0; i < 3; ++i) { //循环输出
printf("%c\n", 'A' + iaInputNumber);
}
return (0);
}
图2:源码2的输出,字符错位,而且循环3次却要求输入4个字符
scanf后面不要加乱七八糟的东西 scanf("\n%c", &temp); //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的无效的输入,这是为什么?
printf("%d ",temp); //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?
scanf的括号里不要加多余的符号,前后都不要加,否则容易出错。
printf("%d ",temp); 这里%d后面有空格,输出的时候当然也有空格了,如果要一起输出,把%d后面的空格删除 chxchxkkk 发表于 2021-2-6 14:34
scanf("\n%c", &temp); //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的 ...
我的意思就是我的代码里在数字后面有空格,但是输出的时候数字后面的空格没了,错位了。移到了下一次输出的前面。这是为什么呢? wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西
不使用占位符,不使用换行符,输出错误结果 人中仙 发表于 2021-2-6 19:49
不使用占位符,不使用换行符,输出错误结果
那一定是代码有问题,要从源头上找原因
比如你既然想接收整数,那么用%c来接收就百思不得姐了 本帖最后由 人中仙 于 2021-2-6 20:57 编辑
wp231957 发表于 2021-2-6 20:17
已经解决,编译器问题。直接复制到Dev-C++里,正常运行。
wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西
有些时候还是必要的,检测一下输入合法,比如日期,中间加点东西还是不错的,fscanf就是一个差不多的例子
页:
[1]