【问题标题】:C - Read a single int at the timeC - 当时读取一个 int
【发布时间】:2016-01-07 23:04:21
【问题描述】:

我有这个输入:

输入:2015

我想像这样扫描他:

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

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

【问题讨论】:

  • 逐个读取字符(必要时将每个字符转换为整数)?
  • 使用%c 读取字符。那么整数值就是c - '0'
  • 你的意思是数字。就像在学校里一样。请使用正确的术语,否则不清楚您的意思。

标签: c input integer int scanf


【解决方案1】:

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

#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);
    }
}

【讨论】:

    【解决方案2】:

    如果您的输入是固定大小的,例如 2015,那么您可以使用

    int arr[4];
    for(int i=0; i<4; i++){
        scanf("%1d", arr+i);
    }
    

    但对于一般情况,您可以使用fgets 读取为字符串。

    【讨论】:

      【解决方案3】:

      我建议阅读整行,然后具体解析。

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-16
        • 1970-01-01
        • 2012-08-24
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多