首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getchar vs scanf:为什么getchar不工作?

getchar vs scanf:为什么getchar不工作?
EN

Stack Overflow用户
提问于 2020-02-06 03:34:41
回答 2查看 114关注 0票数 1

我写了一个简单的程序来输入一个数字并返回任意值,当除以它时,将返回3的余数。

我目前正在阅读K&R,它直到第7章才开始教授scanf,所以我尝试使用getchar。它不能工作,但是scanf可以。我做错了什么?

代码语言:javascript
复制
int main()
{
    int c, i;

    printf("Input an integer: ");
    //c = getchar();
    scanf("%d", &c);

    for (i = 1; i <= 100; i++) {
        if ((i % c) == 3) {
            printf("%d\n", i);
        }
    }
    return 0;
}

可选的附带问题:这里的人们似乎一直建议不要从K&R开始,对于初学者来说,什么可能是更好的选择?

EN

回答 2

Stack Overflow用户

发布于 2020-02-06 04:00:52

这一点:

代码语言:javascript
复制
scanf("%d", &c);

正在请求scanf()从标准输入中读取整数值。scanf()函数将根据需要从标准输入中读取尽可能多的字符,然后将它们解析为整数,并将值存储在变量c中(即,在&c指向的地址)。scanf()的返回值还传递正确解析的项数,因此在这种情况下,您应该检查返回值是否为1

这一点:

代码语言:javascript
复制
c = getchar();

正在请求getchar()从标准输入中读取单个字符。getchar()函数将尝试读取一个字符,并在成功的情况下返回该字符(强制转换为int)。如果出现错误或文件结尾,将返回特殊的整数值EOFgetchar()返回int并不意味着函数会像scanf("%d", ...)那样解析输入。实际上,返回值的类型为int,只是因为需要它来区分EOF中的有效字符。

要了解更多信息,请参阅使用man命令的scanfgetchar手册页,例如man scanf。参考手册页对于理解函数的语义很重要。始终阅读手册。或者,你也可以在网上查找:scanf()getchar()

如果要使用getchar()扫描单个字符并将其转换为整数,则可以执行以下操作:

代码语言:javascript
复制
#include <stdio.h>  // getchar(), puts()
#include <ctypes.h> // isdigit()

int main(void) }
    int c;

    c = getchar();
    if (c == EOF) {
        puts("Error!");
        return 1;
    }

    if (!isdigit(c)) {
        puts("Character is not a digit!");
        return 1;
    }

    int value = c - '0';
    // value now holds the integer corresponding to the digit that was read from input

    /* ... */

    return 0;
}

备注:c - '0'之所以有效,是因为表示数字的字符在ASCII表中的值按顺序递增(从0x30到0x39)。另请参见man ascii

票数 1
EN

Stack Overflow用户

发布于 2020-02-06 04:05:45

getchar从输入流中读取一个符号,并将其作为内部表示形式或EOF的整数值返回。

因此,要读取一个至少有两位数的数字,您必须多次调用getchar,然后将符号的表示形式转换为相应的整数。

getchar相反,如果指定了专门用于读取数字的转换格式%d或类似格式,则scanf会尝试将整数作为整数读取

下面是一个演示程序,它展示了如何使用getchar实现您的程序。在程序中,没有检查用户输入的数字是否太大。您可以自己添加这样的检查。

代码语言:javascript
复制
#include <stdio.h>
#include <ctype.h>

int main(void) 
{
    const unsigned int REMAINDER = 3;

    printf( "Input a non-negative integer: " );

    unsigned int n = 0;

    for ( int c; ( c = getchar() ) != EOF && isdigit( ( unsigned char )c ); )
    {
        const unsigned int Base = 10;

        n = Base * n + ( c - '0' );
    }


    if ( n > REMAINDER )
    {
        const unsigned int N = 100;
        for ( unsigned int i = 0; i < N; i++ )
        {
            if ( ( i + 1 ) % n == REMAINDER ) printf( "%u ", i + 1 );
        }
        putchar( '\n' );
    }

    return 0;
}

例如,程序输出可能如下所示

代码语言:javascript
复制
Input a non-negative integer: 10
3 13 23 33 43 53 63 73 83 93 

至于书,读一本你还不熟悉的语言或技术的书总是很困难的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60082917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档