C - 当时读取一个int

时间:2015-10-09 21:57:39

标签: c input integer int scanf

我有这个输入:

  

输入:2015

我想像这样扫描他:

scanf("%1d", &arr);

但这绝对是错误的。我能做什么? 我想通过整数接收输入整数,如'2','0','1','5',而不是像“2015”。

2 个答案:

答案 0 :(得分:2)

只需单独阅读每个字符,然后将单个char转换为整数。

#include <stdio.h>

int main(int argc, char* argv[])
{
    size_t len, i;
    char buff[64];

    fgets(buff, sizeof(buff), stdin);

    for(i = 0, len = strlen(buff); i < len; ++i) {
        int curr = buff[i] - '0'; /* subtracting '0' converts the char to an int */
        printf("%d\n", curr);
    }
}

答案 1 :(得分:1)

我建议阅读整行,然后专门解析。

要在POSIX系统上读取一行,请使用getline(3),它将在堆中分配行缓冲区(不要忘记将包含行的指针初始化为NULL,并将变量大小初始化为0,free你完成的行。如果您不熟悉没有getline的系统,请声明一个较大的(例如至少256个字节)缓冲区并使用fgets(3)。 BTW,在Linux上,来自终端-a.k.a的可编辑输入。 tty - (不是管道或文件,因此使用isatty(3)进行测试)您甚至可以考虑使用readline(3);尝试一次,它非常方便!

一旦整行都在内存中,你就可以解析它(前提是你定义了该行的语法,至少在你脑海中;一个例子通常是不够的;你可能想在你的EBNF中使用sscanf(3)文档)。

您可以使用strtol(3)来解析该行或使用一些迭代代码手动解析它等等。不要忘记检查已返回的扫描项目数。也许%n可以很方便(获取字节数)。您也可以手动解析该行,或使用strtok(3)解析long个数字,(或者我可能Skype URI API Reference,因为它是有状态的)等等......