4

在我测试之前,我一直认为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 类型和 char 输入

由于 EOF-1inttype 中,我也尝试使用scanf("%d",&i);replace scanf("%c",&i),得到相同的输出。

我很困惑。有人可以为我解释一下吗?

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

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

#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
4

2 回答 2

3

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

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

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

于 2013-08-28T14:44:35.790 回答
3

您的比较没有完全确定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,您也可能会进行匹配。如果您以char255 的值扫描 a,则 char 将采用 2s 的 8 位值 -1。比较将符号扩展 8 位 -1 以匹配int大小,您将匹配 -1。
(假设:2s 补码整数,8 位字节,EOF == -1,char 有符号)。

正确的 EOF 测试是

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

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

于 2013-08-28T14:46:57.827 回答