【问题标题】:Scanf reads wrong valueScanf 读取错误值
【发布时间】:2019-11-03 16:48:03
【问题描述】:

我是 C 编程语言的新手,我编写了一个简单的代码,它读取两个“char”值并将它们打印在屏幕上,但由于奇怪的原因,第二个得到了空值。我的代码出了什么问题?

Char c;
Scanf(“%c”,&c);
Printf(“Value:%c”,c);
Scanf(“%c”,&c);
Printf(“Value:%c”,c);

输出: 值:g 价值:

【问题讨论】:

  • CharScanfPrintf 是什么? C 具有相似的功能/类型(带有前导小写字母),但不是那些。这是一个错字还是一些本地定义?如果是后者,您需要提供一些详细信息。
  • 没有错。你输入了一个 'g' 和一个换行符,程序打印了 'Value:gValue:\n`

标签: c input scanf newline c89


【解决方案1】:

(这是注释,但 cmets 很难格式化)

您的代码没有任何问题(除了未能检查 scanf 返回的值并处理错误或不正确的输入)。考虑:

#include <stdio.h>
int
main(void)
{
        char c;
        scanf("%c",&c);
        printf("Value:%c",c);
        scanf("%c",&c);
        printf("Value:%c",c);
        return 0;
}
$ gcc a.c
$ printf 'abc' | ./a.out
Value:aValue:b

也许“错误”是您的输入中有换行符。 (例如,您以交互方式输入数据,却忘记了当您点击“返回”时,会在输入流中插入换行符。)

【讨论】:

  • 显然输入中有换行符。没必要用这样含羞的回答来取笑 OP。
  • 我不同意这很明显,这根本不是为了“取笑”OP。
【解决方案2】:

如果您的目标是阅读两个“有趣”的字符,并且如果您不认为空格和换行符等空白字符“有趣”,那么您已经被关于 @ 的 17 件事中的第 6 件事绊倒了987654322@ 旨在让粗心大意的人绊倒:%c 确实读取空白字符。

如果您希望scanf 跳过空白字符,以便%c 将读取下一个非空白或“有趣”字符,只需在格式字符串中的%c 之前包含一个空格字符:

char c;
scanf(" %c", &c);
printf("Value: %c\n",c);
scanf(" %c", &c);
printf("Value: %c\n",c);

scanf 格式字符串中,存在空白字符表示您希望scanf 在输入中跳过所有 个空白。

通常您不必担心使用scanf 跳过空格,因为大多数其他格式说明符——%d%f%s 等——会自动跳过任何空格,如有必要,在他们开始解析输入之前。但是%c 很特别:有人认为你可能想用它来读取空白字符,所以它不会跳过它们,所以如果你不想阅读它们,你必须自己跳过它们,用那个空格字符首先在格式字符串中。

【讨论】:

  • 嗨,为什么即使用户必须按下回车键才能让 scanf 函数获取值,新行仍​​被视为输入? (就像 C# 和大多数其他编程语言一样)
  • @Jobert001 scanf 函数适用于不间断的字符。现在,这是真的,来自键盘的输入通常被分成几行,并且您的程序在您按下 Return 键以指示您已完成输入之前看不到任何内容(此时该行上的所有字符都可用于你的程序一次),但这是较低级别的功能,与scanf无关。
  • 我邀请您运行此代码:while(scanf("%c", &amp;c) == 1) printf("You typed: %c\n");。或类似的代码:int c; while((c = getchar()) != EOF) printf("You typed: %c\n");。请注意,当您键入一些字符并按 Return 时,“您键入的”行会立即出现。仔细考虑一下。 (另见these class notes。)
  • @Jobert001 同样,scanf 只看到一个字符流,它对待所有空白字符——空格、制表符、换行符等——都是一样的。为什么要这样设计?我不能告诉你。 (我当时不在那里,那是在我的时代之前。)我同意以这种方式工作并不总是很方便。事实上,我建议所有 C 程序员学习其他不涉及scanf 的用户输入方式,并尽快完全放弃scanf。这真的不是一个很好的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2013-06-04
  • 2021-11-29
相关资源
最近更新 更多