从stdin读取各种输入

时间:2019-06-16 13:50:21

标签: c inputstream user-input variable-length

我正在从标准输入中阅读。用户被提升为输入一位数字或输入三位数字。 哪个功能可以解决这个问题?

我尝试过

    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}

1 个答案:

答案 0 :(得分:4)

您已接近所需的内容,但您阅读的是 int 而不是字符串

 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 或完成错误到达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”)< / p>