人中仙 发表于 2021-2-6 13:55:05

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个字符

wp231957 发表于 2021-2-6 14:16:14

scanf后面不要加乱七八糟的东西

chxchxkkk 发表于 2021-2-6 14:34:17

scanf("\n%c", &temp);   //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的无效的输入,这是为什么?
printf("%d ",temp);   //用来观察输出情况。在此处输出时,第2行开始 %d 与 空格 分开了,源码中一起输出的东西为什么会分开?

scanf的括号里不要加多余的符号,前后都不要加,否则容易出错。
printf("%d ",temp); 这里%d后面有空格,输出的时候当然也有空格了,如果要一起输出,把%d后面的空格删除

人中仙 发表于 2021-2-6 19:47:33

chxchxkkk 发表于 2021-2-6 14:34
scanf("\n%c", &temp);   //这里的格式控制字符串中的'\n'必须要放在%c的前面,否则就会在输入时请求额外的 ...

我的意思就是我的代码里在数字后面有空格,但是输出的时候数字后面的空格没了,错位了。移到了下一次输出的前面。这是为什么呢?

人中仙 发表于 2021-2-6 19:49:08

wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西

不使用占位符,不使用换行符,输出错误结果

wp231957 发表于 2021-2-6 20:17:47

人中仙 发表于 2021-2-6 19:49
不使用占位符,不使用换行符,输出错误结果

那一定是代码有问题,要从源头上找原因
比如你既然想接收整数,那么用%c来接收就百思不得姐了

人中仙 发表于 2021-2-6 20:40:35

本帖最后由 人中仙 于 2021-2-6 20:57 编辑

wp231957 发表于 2021-2-6 20:17

已经解决,编译器问题。直接复制到Dev-C++里,正常运行。

Minecraft程序猿 发表于 2021-2-6 21:16:14

wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西

有些时候还是必要的,检测一下输入合法,比如日期,中间加点东西还是不错的,fscanf就是一个差不多的例子
页: [1]
查看完整版本: C语言中scanf();printf();函数使用的问题