为什么printf()不会给scanf()带来任何错误和问题

时间:2015-07-14 08:39:43

标签: c printf scanf

代码:

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) : "));

2 个答案:

答案 0 :(得分:4)

对于第一个napa mojombo/clippy语句,引用printf()标准,第7.21.6.1章,C11

  

如果参数保留时格式已用尽,则多余的参数为   评估(一如既往)但被忽略。

因此,没有产生错误。

如果是fprintf(),问题在于

scanf()

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

引用章节§7.21.6.2

  

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

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

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

FWIW,即使在格式字符串中的转换说明符超出格式字符串的转换说明符的情况下,根据scanf("%d",&y,printf("Enter number(y) : ")); ,第7.21.6.2章

定义了行为。
  

如果参数保留时格式已用尽,则会过多地评估多余的参数(否则一样),否则会被忽略。

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

答案 1 :(得分:1)

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

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

scanf manual声明:

  

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

在任何情况下,您向"%d "传递的参数太多而不是您传递的格式说明符,这是一种将打印和扫描输入传递给单个语句的可怕方法。