【问题标题】:Reading various inputs from stdin从标准输入读取各种输入
【发布时间】:2019-06-16 13:50:21
【问题描述】:

我正在读取标准输入。用户被提升为输入一位数字或输入三位。 这个问题哪个函数好?

我试过了

    int in[3] = {-1, -1, -1};
    scanf("%d %d %d", &in[0], &in[1], &in[2]);
    printf("%d, %d, %d\n", in[0], in[1], in[2]);

这适用于三位数字,但如果只输入一位,则效果不佳。

我想拥有例如输入为“17”或“0 1 9” 那么输出应该是例如

int amount = 1
int digits[3] = {17, -1, -1}

int amount = 3
int digits[3] = {0, 1, 9}

【问题讨论】:

  • 这很好用不,它没有。你创建一个指向 char 的指针数组,然后向 scanf 声明你正在给它指向 int 的指针。为什么?你的编译器不会因为你这样做而尖叫吗?至于问题:scanf 返回它获得了多少项目,因此您可以为未读入的项目设置默认值。
  • @SamiKuhmonen 是的,你是对的。我粘贴了错误的版本。

标签: c inputstream user-input variable-length


【解决方案1】:

你已经接近你想要的了,但是你读的是 int 而不是 string 所以

 char *in[3] = {-1, -1, -1};

必须

int in[3] = {-1, -1, -1};

还允许将 -1 作为有效的初始值。

这适用于三位数字,但如果只输入一位,则效果不佳。

执行scanf("%d %d %d", &in[0], &in[1], &in[2]); 完成您需要输入 3 个有效的 int 或完成错误 ro 达到 EOF 或提供无效输入,以便只能输入一个值执行 fgets 然后 _a __sscanf_

我想拥有例如输入为“17”或“0 1 9”输出应为例如

int amount = 1
int digits[3] = {17, -1, -1}

int amount = 3
int digits[3] = {0, 1, 9}

举个例子

#include <stdio.h>

int main(void)
{
  char line[32];

  if (fgets(line, sizeof(line), stdin) == line) {
    int ints[3] = { -1, -1, -1 };
    int amount = sscanf(line, "%d %d %d", &ints[0], &ints[1], &ints[2]);

    printf("%d : { %d %d %d }\n", amount, ints[0], ints[1], ints[2]);
  }

  return 0;
}

编译和执行

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $ ./a.out
17
1 : { 17 -1 -1 }
pi@raspberrypi:/tmp $ ./a.out
0 1 9
3 : { 0 1 9 }
pi@raspberrypi:/tmp $ ./a.out
1 a
1 : { 1 -1 -1 }
pi@raspberrypi:/tmp $ ./a.out
a
0 : { -1 -1 -1 }
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ ./a.out

-1 : { -1 -1 -1 }
pi@raspberrypi:/tmp $ 

(在最后一种情况下是一个空行,例如只需 enter

我将 digits 重命名为 ints 因为 digits 假设每个条目都是一个数字(例如“0”),而您需要整数

【讨论】: