【问题标题】:Why does scanf read every letter as 39? [duplicate]为什么scanf将每个字母都读取为39? [复制]
【发布时间】:2019-07-12 04:43:47
【问题描述】:

我使用了scanf("%d" ,&a),但出于好奇,我在输入控制台中输入了字母,令我惊讶的是每次输出都是 39,为什么会这样?

我是语言新手,所以我制作了这个程序,它读取/扫描用户的输入并打印输出(一种复制粘贴程序) 为了舒服起见,我使用整数作为变量值,但在执行代码时,我没有输入整数,而是输入字母 [ex:- 'a', 'aaaaaaa', 'afadfad', 'awsw121', 'a1'] 但每次输出都是 39。

int a;
 printf("what`s your age in years?\n");

 scanf("%d" ,&a); 

 printf("your age is %d \n" , a);

每当我输入像['1a' , '2afasfadfa' , '5awwee']这样的输入时

{所有以整数开头的输入}

答案是正确的。我认为代码只读取整数,一旦它得到它的输入,它就会中断那里的执行。

【问题讨论】:

  • 那些是字母,不是字母。
  • 您期待任何特定的结果吗?如果没有,您很可能想改变学习 C 的方法。“让我们做一些奇怪的事情,看看会发生什么”对于这种特定的语言并不适用。
  • ' 的 ASCII 值无关紧要。您正在打印一个未初始化的变量。永远不要忽略scanf的返回值;它告诉你有多少项目被成功读取:if (scanf("%d", &a) != 1) { error }
  • 39 只是 a 开头的值,因为它未初始化。当您输入不是数字的内容时,不会进行任何转换,也不会在a 中存储任何值。检查来自scanf 的返回值。如果您键入的内容以数字开头,则会对其进行处理和转换,直到找到非数字字符。
  • @shubhamranjan 不,我不是指a 的值,我是指scanf 函数本身的返回值,如果你这样做r = scanf(...)

标签: c scanf


【解决方案1】:

当您在 scanf 中有 %d 并键入一个字符时,scanf 不会读取任何内容。它实际上返回读取的 0 个元素的值。

您得到的值 39 可能是因为您在堆栈上声明了int a,这将具有任何随机值。再次运行程序可能会也可能不会更改此内存。

您可以通过使用其他值初始化 a 来检查这一点,例如int a = 5 并且输出将始终为 5。

另外你应该经常检查 scanf 的返回值,看看你是否真的读到了你所期望的。

int a;
printf("what`s your age in years?\n");
if (scanf("%d" ,&a) != 1)
{
   // handle error
}   
printf("your age is %d \n" , a);

我认为代码只读取整数,一旦获得输入,它就会自行中断执行。

这并不完全正确。 scanf%d 将读取整数,其余字符将保留在缓冲区中。

所以,如果你用%d 尝试另一个scanf,它会再次失败。

这种情况的解决方案是完全读取缓冲区,然后将其丢弃。例如与

int c;
... 
while ((c = getchar()) != '\n' && c != EOF);

【讨论】:

  • while (scanf("%c",&dummy)==1); 将仅在 EOF 上停止。你可能想要int c; while ((c = getchar()) != '\n' && c != EOF);
【解决方案2】:

scanf() 返回成功转换的次数。如果用户输入一个数字,它会被转换并存储到变量中,scanf() 返回 1,如果用户输入的不是数字,比如 AA,scanf() 会将违规输入留在标准输入缓冲区中并返回0,最后如果到达文件末尾(用户在windows中输入^Z enter或在unix中输入^D),scanf()返回EOF

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2020-03-07
    • 2021-03-19
    相关资源
    最近更新 更多