【问题标题】:difference between scanf("%c" , ..) and getchar()scanf("%c" , ..) 和 getchar() 之间的区别
【发布时间】:2013-08-28 14:34:16
【问题描述】:

在我测试之前,我一直认为scanf("%c" , &addr); 等于getchar()

#include<stdio.h>

int main()
{
    int i;
    scanf("%c",&i);
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input\n");
    i =getchar();
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input\n");
}

当我使用“Ctrl+D”两次时,我得到了输出:

-1217114112

-1

EOF int 类型和字符输入

由于 EOF 在 int 类型中是 -1 ,我也尝试使用 scanf("%d",&amp;i); 替换 scanf("%c",&amp;i) ,得到相同的输出。

我很困惑。谁能帮我解释一下?

----------------------编辑------------ ----------------------------------

我想知道 Ctrl+D 的scanf("%c",i) 的行为,我做测试:

#include<stdio.h>

int main()
{
    int i;
    int j;
    j = scanf("%c",&i);
    printf("%c\n", i);
    printf("%d\n", j);
    if(i == EOF)
        printf("EOF int type and char input");
     i =getchar();
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input");
}

输出:

k                  // If the scanf set 1 byte in i , why here print 'k' ?
-1
-1
EOF int type and char input

【问题讨论】:

  • 输出中的ki 中的随机垃圾值,在您尝试通过将其传递给scanf() 以将其作为char 处理而不是int 就是这样。当scanf() 遇到EOF(要读取零个字符)时,它根本不会分配给变量;它只返回 EOF。如果j 不是 1,那么对于i 中的内容,您无话可说;它的值是不确定的(但可能与您在函数调用之前开始的相同 - 但在示例代码中,这是未定义的,因为 i 未初始化)。

标签: c io


【解决方案1】:

您的比较未完全设置 i,因为它涉及未定义行为 (UB)。

int i;            // the value of i could be anything
scanf("%c",&i);   // At most, only 1 byte of i is set, the remaining bytes are still unknown.
printf("%d\n", i);// Your are printing 'i' whose value is not fully determined.

你试过了吗

char ch;
int y = scanf("%c",&ch);
printf("%d\n", ch);
if(ch == EOF)

即使输入不是 EOF,您也可能会进行匹配。如果您扫描了值为 255 的 char,则该字符将采用 2s 的 8 位值 -1。比较将符号扩展 8 位 -1 以匹配 int 大小,您将匹配 -1。
(假设:2s 补码整数,8 位字节,EOF == -1,char 有符号)。

正确的 EOF 测试是

int y = scanf("%c",&ch);
if (y == EOF)

注意:getchar() & scanf() return EOF 表示文件结束 I/O 错误。随后对ferror(stdin) 的检查可以区分这一点。

【讨论】:

  • 我做了测试,它显示 scanf return -1 ,那么scanf设置的1字节是否?
  • 否,未设置 1 个字节。只有当scanf("%c",&amp;i) 返回 1 时,i 中的一个字节才会被设置。当然i的其他字节没有变化。
【解决方案2】:

第一个值可能是未定义的行为。除非scanf() 返回 1,否则您不能依赖 i 的值。

尤其是scanf(),您似乎将扫描值(根据第一个参数中的格式说明符转换字符)与函数调用的返回值混淆了。

对于getchar(),当然不存在这种区别,因为它只有有返回值。

【讨论】:

  • E .. 是的,scanf 返回 -1!
  • 我编辑了我的问题,当scanf返回-1时,i的地址到底发生了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2023-03-17
  • 1970-01-01
  • 2016-12-05
  • 2016-04-13
  • 1970-01-01
相关资源
最近更新 更多