奇怪的printf& scanf行为

时间:2016-02-19 06:19:15

标签: c scanf

我对C编程很陌生,我想知道为什么在使用以下代码时需要输入两次相同的值?

#include <stdio.h>

int main(void)
{
  int ascii;

  printf("Enter an ASCII value: ");
  scanf(" %d\n", &ascii);
  printf("The %d ASCII code has the character value %c\n", ascii, ascii);

  return 0;
}

您可以看到我必须在下面的图片中输入89两次。

http://i.stack.imgur.com/aSEFw.jpg

2 个答案:

答案 0 :(得分:3)

您需要2个值,因为 format-string 包含two 格式说明符,例如:

" The %d ASCII code is character '%c'\n\n"

指定two转换(例如%d%c)。它们每个都需要参数列表中的相应值。 e.g:

printf ("\n The %d ASCII code is character '%c'\n\n", ascii, ascii);
                ^                           ^           1      2

没有魔力,只需仔细看看man printf。您只是为相同的值打印两个不同的转换。因此,每次转换都需要自己的价值。

如果您仍然遇到问题,请随时进一步询问。以下是您的代码的简短版本,可以正常工作:

#include <stdio.h>

int main (void) {

    int ascii;
    printf ("Enter and ASCII code value: ");
    if (scanf ("%d%*c", &ascii) != 1) {
        fprintf (stderr, "error: invalid value entered.\n");
        return 1;
    }

    printf ("\n The %d ASCII code is character '%c'\n\n", ascii, ascii);

    return 0;
}

<强>输出

$ ./bin/enterascii
Enter and ASCII code value: 89

 The 89 ASCII code is character 'Y'

您的'夸脱'帖子

您未在'\n'格式字符串中包含scanf

scanf(" %d\n", &quarts);

应该是

scanf("%d%*c", &quarts);

注意: %*c只会读取并丢弃因按 Enter 键而产生的'\n'。这不是必需的,但是最好从输入缓冲区(stdin)中删除它,否则如果您尝试在同一代码中使用后续scanf调用来获取字符或字符串输入,则会感到惊讶。

答案 1 :(得分:3)

您需要删除\n模式中的空格(空格和scanf),即"%d"而不是" %d\n"

#include <stdio.h>

int main(void)
{
  int ascii;

  printf("Enter an ASCII value: ");
  scanf("%d", &ascii);
  printf("The %d ASCII code has the character value %c\n", ascii, ascii);

  return 0;
}