鱼C论坛

 找回密码
 立即注册
查看: 2256|回复: 7

C语言中scanf();printf();函数使用的问题

[复制链接]
发表于 2021-2-6 13:55:05 | 显示全部楼层 |阅读模式
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:输出错位

图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:要求额外的输入

图2:要求额外的输入

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 14:16:14 From FishC Mobile | 显示全部楼层
scanf后面不要加乱七八糟的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

scanf的括号里不要加多余的符号,前后都不要加,否则容易出错。
printf("%d ",temp); 这里%d后面有空格,输出的时候当然也有空格了,如果要一起输出,把%d后面的空格删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


我的意思就是我的代码里在数字后面有空格,但是输出的时候数字后面的空格没了,错位了。移到了下一次输出的前面。这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-6 19:49:08 | 显示全部楼层
wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西

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

错误输出

错误输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 20:17:47 From FishC Mobile | 显示全部楼层
人中仙 发表于 2021-2-6 19:49
不使用占位符,不使用换行符,输出错误结果

那一定是代码有问题,要从源头上找原因
比如你既然想接收整数,那么用%c来接收就百思不得姐了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-6 20:40:35 | 显示全部楼层
本帖最后由 人中仙 于 2021-2-6 20:57 编辑


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 21:16:14 From FishC Mobile | 显示全部楼层
wp231957 发表于 2021-2-6 14:16
scanf后面不要加乱七八糟的东西

有些时候还是必要的,检测一下输入合法,比如日期,中间加点东西还是不错的,fscanf就是一个差不多的例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表