【问题标题】:Why printf() don't gives any error and issue with scanf()为什么 printf() 没有给出任何错误和 scanf() 问题
【发布时间】:2015-07-14 08:39:43
【问题描述】:

代码:

int main(int argc,char **argv)
{
  int y,i;
  printf("Number of character you entered is : %d",printf("you entered age : %d\n",i,scanf("%d",&i),printf("Enter age : "))-19);
  printf("\n\n");
  scanf("%d ",&y,printf("Enter number(y) : "));
  printf("Value of y is %d",y);
}

这里有两条语句, 在第一个陈述中,我想问为什么printf() 没有给出任何错误或警告?

printf("Number of character you entered is : %d",printf("you entered age : %d\n",i,scanf("%d",&i),printf("Enter age : "))-19);

执行时的第二条语句是两次请求输入,第一次之后

"输入数字(y):"

输入数字后,它要求另一个输入,不知道为什么。

y 的值是你第一次输入的值,那么第二次输入的原因是什么?

scanf("%d ",&y,printf("Enter number(y) : "));

【问题讨论】:

  • 我不确定我是否理解您的问题。为什么会有错误或警告?
  • 你真的知道你在做什么吗?恕我直言,这段代码不是人类可读的。
  • printf()scanf() 都返回整数值,所以语法没有问题。 printf() 语句的参数必须在调用函数之前进行评估,以便解释事件的顺序。但这真的是很糟糕的代码。
  • 这段代码太棒了!无需混淆!!
  • 是的,另一个最低不及格或失业救济金的候选人。

标签: c printf scanf


【解决方案1】:

对于第一个 printf() 声明,引用 C11 标准,第 7.21.6.1 章,fprintf()

如果格式已用尽而参数仍然存在,则多余的参数将 评估(一如既往),但在其他方面被忽略。

所以,没有产生错误。

如果是scanf(),问题出在

 scanf("%d ",&y,printf("Enter number(y) : "));
          ^
          |

格式说明符后的尾随空格。基本上它告诉在第一个匹配转换说明符的输入之后忽略任意数量的尾随空格。在遇到非空白字符时,它实际上会完成扫描

引用章节§7.21.6.2

由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)来执行,.....

解决方案:删除转换说明符后的尾随空格。

scanf("%d",&y,printf("Enter number(y) : "));

FWIW,即使在格式字符串中的参数超出转换说明符的情况下,也按照C11,第 7.21.6.2 章定义了行为

如果格式已用尽而参数仍然存在,则评估多余的参数(一如既往),否则将被忽略。

这是一种可怕编写代码的方式。

【讨论】:

  • 谢谢!! , 问题解决
【解决方案2】:

它不会要求输入“两次”,而是 scanf() 正在等待您输入非空格空白字符来终止输入读取,因为格式字符串中有额外的空间:"%d "

scanf() 中的空白指令将读取并丢弃任意数量的空白字符。因此,您必须输入非空白字符:

scanf manual 状态:

· 一系列空白字符(空格、制表符、换行符、 ETC。;参见 isspace(3))。该指令匹配任何数量的 输入中的空格,包括无空格。

无论如何,您传递给scanf() 的参数比您传递的格式说明符多,这是将打印和扫描输入传递给单个语句的糟糕方式。

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2017-11-26
    • 2015-01-30
    • 2022-06-13
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多