scanf()可以存储值吗?

时间:2013-08-21 18:57:08

标签: c scanf

您好,我现在正在学习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之后的值?

5 个答案:

答案 0 :(得分:8)

您需要将int类型与%d说明符结合使用,将char%c说明符结合使用。并且%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;
}

Basicaly,scanf将尝试从输入读取整数,并尝试将其存储在不够大的内存位置,因此您将有未定义的行为。

您可以找到好的参考here

但是,如果您尝试将字符用于输入类型,您可能需要问问自己为什么没有机会输入第二个数量(如果您键入4并按Enter键)。这是因为第二个scanf将输入键作为字符。此外,如果您尝试键入21(对于二十一个),它将使用2填充第一个值,使用1填充第二个值(以及使用其ASCII值)。

所以,要小心 - 确保始终为变量选择正确的类型。

答案 1 :(得分:3)

Never use scanf Never use scanf 说真的,never use scanf

使用fgets(或getline,如果有的话)从用户读取整行输入,然后将字符串转换为strtol或其亲属{{3 }和strtodstrtoul也可能有用。

答案 2 :(得分:1)

通过读取其返回值来检查scanf()是否正常工作。要快速入门,请在this link阅读有关scanf()的详细信息。

您正在做的是使用"%d"unsigned char变量输入一个整数,因此scanf()可能无法正常工作。

答案 3 :(得分:1)

更改

unsigned char one=0; unsigned char two=0;

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

并使用%u代替%d,然后它会在scanf()之后打印该值。

答案 4 :(得分:1)

您将变量one声明为char:

unsigned char one=0;

然后你告诉scanf阅读int

scanf("%d",&one);  /* %d means int */

Int大于char(通常为4字节对1字节),导致您描述的问题。

将您的scanf更改为:

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

然后当你打印出值时,也打印一个char:

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