scanf()能够存储值吗?

5

你好,我正在学习 C 语言,但在我读的一本书上出现了一道题目,我有些问题。我的代码如下:

#include<stdio.h>
int main()
{
  unsigned char one=0;
  unsigned char two=0;
  printf("Quantity 1 = ");
  scanf("%d",&one);
  printf("Quantity 2 = ");
  scanf("%d",&two);
  printf("The value is %d",one);
  return 0;
}

当我尝试查看one的值时,为什么出现的是初始值而不是scanf后的值?

欢迎来到SO。很好的示例展示了你的问题。 - chux - Reinstate Monica
如@Shade下面的链接所示,如果您想使用unsigned char作为变量类型,可以使用%c%hhu格式说明符。 - 0xF1
1
@nishant fscanf()长度修饰符:C11 7.21.6.2 11 "hh表示接下来的d、i、o、u、x、X或n转换说明符适用于带有指向有符号字符或无符号字符的参数。"fprintf()同理。我希望这个疑问能够减轻。 - chux - Reinstate Monica
@chux:谢谢!明白了。 - 0xF1
1
@nishant:对于unsigned char,如果您将其视为小整数,请使用%hhu,因此“42”会给您(unsigned char(42)。(顺便说一下,在大多数英语国家,“doubt”并不等同于“question”;“doubt”这个词意味着怀疑。) - Keith Thompson
显示剩余3条评论
5个回答

8
你需要使用%d说明符与int类型一起使用,使用%c说明符与char类型一起使用。对于无符号整数,请使用%u
#include<stdio.h>
int main()
{
    unsigned int one=0; unsigned int two=0;
    printf("Quantity 1 = ");scanf("%u",&one);
    printf("Quantity 2 = ");scanf("%u",&two);
    printf("The value is %u",one);
    return 0;
}

基本上,scanf 会尝试从输入中读取整数,并尝试将其存储在内存位置中,但内存位置不足时会导致未定义的行为。
你可以在这里找到良好的参考文献(链接)
然而,如果你尝试使用字符作为输入类型,你可能想问问自己为什么没有机会输入第二个数量(如果你键入4并按回车键)。这是因为第二个 scanf 将回车键读入为一个字符。另外,如果你尝试键入21(表示二十一),它将以它们的 ASCII 值填充第一个值为2,第二个值为1
所以,请小心 - 确保你总是选择正确的变量类型。

3
当处理无符号整数时,您需要使用 %u - Shade
@nishant 或 %hhd%hhi%hho%hhx - chux - Reinstate Monica
确实如此。然而,我不建议在此处使用 char 指定符,因为它也会将 ENTER 解析为一个字符。 - Nemanja Boric

2

1
@paulakis,scanf 没有问题,只要正确使用就可以了。人们会遇到麻烦,是因为他们没有阅读它的文档。如果你的学校作业要求使用 scanf,那么学会使用 scanf 是一个很好的阅读文档的练习。 - JackCColeman
@Zack 这在哪里说了?没有。 - JackCColeman
@zack,那不是输入溢出。 - JackCColeman
@JackCColeman 请提供标准文本来支持您的立场。 - zwol
@Zack,你真正指出了我认为的真正问题。也就是说,人们阅读规范时会把它当作法律文件来看待。问题在于没有普遍接受的标准解释。也就是说,没有法律体系,没有诉讼。因此,我们只能编写我们认为符合标准的代码,然后进行测试。编译器成为了法官和陪审团!因此,你引用的条款基本上是说,如果程序员没有正确编写scanf,则允许产生错误。 - JackCColeman
显示剩余9条评论

1
检查 scanf() 的返回值是否正常工作。 为了快速入门,请阅读关于 scanf() 的详细信息,点击 this link
你正在使用 "%d" 将整数输入到一个 unsigned char 变量中,因此 scanf() 可能不能正常工作。

1
你声明变量one为char类型:
unsigned char one=0;

但是你告诉了 scanf 读取一个 int:
scanf("%d",&one);  /* %d means int */

整型比字符型更大(通常为4字节对1字节),导致您所描述的问题。

将您的scanf更改为:

scanf("%c",&one);  /* %c means char */

然后当您打印出该值时,也打印一个字符:

printf("The value is %c",one); /* %c means char */

我不能确定这是否与@paulakis有关,因为他是C语言的新手,但使用scanf()函数来读取char类型的数据,使用%c格式化符号是否合适? - 0xF1

1
改变
unsigned char one=0; unsigned char two=0;

to

unsigned int one=0; unsigned int two=0;

并且使用%u而不是%d,然后它将打印scanf()之后的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接