【问题标题】:understanding of format specifier integer (%d)对格式说明符整数 (%d) 的理解
【发布时间】:2018-10-06 23:35:17
【问题描述】:

我正在尝试理解格式说明符%d,下面是示例

当我尝试将两个 4 位数字作为

#include <stdio.h>

int main()
{
    int x, y;
    printf("Enter two 4 digit numbers!\n");
    scanf("%2d %2d", &x, &y);
    printf("Display %d %d", x, y);
    return 0;
}

输出:

Enter two 4 digit numbers:
6789 4321
Display: 67 89

在这里,我无法指出为什么这是从x 打印的。

【问题讨论】:

  • 为什么使用%2d作为格式?
  • 匹配失败,检查scanf的返回值
  • 您显示的代码甚至不应该编译。请确保您发布实际代码。
  • 使用scanf("%d %d", &amp;x, &amp;y);
  • 此外,您对scanfprintf 的格式有疑问吗?

标签: c


【解决方案1】:

您的代码,包含

scanf("%2d %2d", &x, &y);

尝试从您的输入中读取两个 2 位整数

6789 4321

67 是存储在x 中的两位整数,89 是存储在y 中的两位整数。输入的其余部分保留在stdin 的缓冲区中。

你的假设

我无法指出为什么这是从 x 打印的

错了,因为

printf("Display %d %d ", x, y);

不仅打印“来自 x”,还打印 xy

要读取两个 4 位整数,请使用

scanf("%4d%4d", &x, &y);

【讨论】:

  • 根据你的回答我什么时候放 scanf("%2d, %4d", &x,&y);它应该打印为 67 8943。但它打印的是 67 89。为什么?
  • 我认为您并不是要将逗号放在%2%4 之间的格式字符串中...鉴于输入6789 4321 %2 读取两位数@987654337 @ 和 %4 读取 89 后跟空格。空格不能出现在整数内,所以scanf() 完成。
  • @CrazyCoder 因为使用"%2d %2d",并且输入1234 5678 前两个字符(12)匹配第一个%2d,接下来的两个字符(34)匹配第二个@ 987654346@。 scanf 并不适合用户输入。阅读this SO article
  • @Jabberwocky 一个疯狂的人询问"%2d %4d"
  • 谢谢@Swordfish 我知道了。
【解决方案2】:

您不应该在scanf 中使用“,”或空格。你可以简单地写成

scanf("%d%d", &x, &y);

【讨论】:

  • 这似乎同时包含“,”和空格。你能更清楚地解释你的意思吗?
  • 不需要逗号或点,但空格是无害的(但不必要)。 scanf() 格式说明符中的空白表示“零个或多个空白字符”。大多数转换说明符已经跳过了前导空格(%c%[…]%n 是唯一没有的),但是空格可以使格式更易于阅读,并且有时很重要。标点符号(.,)必须在输入中明确匹配。
【解决方案3】:

您的代码 scanf("%2d %2d", &amp;x, &amp;y); 可以读取 2 个整数。但这里的问题是,每个整数最多可以有 2 位数字。如果输入更长的内容,它会将前 2 位数字视为第一个整数的一部分,并将 接下来的 2 个字符 视为下一个整数的一部分。输入的剩余部分只是存储缓冲区,不影响输入变量。

这是一个演示:

输入两个 4 位数字:

6789 4321

Display: 67 89 //将67作为第一个整数,接下来的2个字符(89)作为 下一个

..

输入两个 4 位数字:

678 9876

Display: 67 8 //观察 change--> 67为第一个整数,8[space]为下一个 一个(虽然[space] 在存储为int 时会被忽略,但它是 在作为输入提取时考虑)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 2018-07-01
    • 2015-07-29
    相关资源
    最近更新 更多