一次输入如何获得多个值?(不确定性的数量)

时间:2015-04-27 15:34:48

标签: c scanf

如何从键盘输入多个值(整数类型和许多不确定性)?

我需要编写一个程序,允许用户输入任意数字, 每个数字由空格分隔,当用户按Enter键时, 该数字放在每个变量数组中。

例如,

输入数字:1 2 8 9(回车)如果输入第四个(数字),它将建立四个变量来获得该值。

数字[0] = 1,数字[1] = 2,数字[2] = 8,数字[3] = 9。

输入数字:3 4 7(回车)如果输入第三个(数字),则必须建立三个变量才能获得该值。

数字[0] = 3,数字[1] = 4,数字[2] = 7。

我尝试使用scan f功能,但它不起作用,

如果有任何好的建议,请告诉我

#include <stdio.h>
#include <windows.h>

int n, number[10];

main()
{
    printf("Enter Number of integer : ");
    scanf("%d", &n);
    if (n == 1) {
        printf("Enter integer : ");
        scanf("%d", &number[0]);
    } else if (n == 2) {
        printf("Enter integer : ");
        scanf("%d %d", &number[0], &number[1]);
    } else if (n == 3) {
        printf("Enter integer : ");
        scanf("%d %d %d", &number[0], &number[1], &number[2]);
    }
    system("pause");
}

5 个答案:

答案 0 :(得分:2)

您是否考虑过使用scanf()fgets()strtok()的组合进行此操作?

例如,您可以使用scanf()来简单查询预期的输入数量。然后在`strtok()周围使用循环来标记用户的输入:

int main()
{
    char line[1024];
    char *token = {0};
    char delim[]={" \r\n\t"};
    long telPos = 0;
    int count, i;
    int *array = {0};

    printf("Enter Number of integers, <return> then line of integers : \n");
    scanf("%d",&count);

    getchar();//eat the newline (from <return>)

    while (fgets(line, 1024, stdin) != NULL)
    {
        array = malloc(sizeof(int)*count);
        token = strtok(line, delim);
        i = -1;
        while(token)
        {
            if((count - 1) > i++)
            {
                array[i] = atoi(token);
                token = strtok(NULL, delim);
            }
            else
            {
                for(i=0;i<count;i++) printf("value %d: %d\n", i, array[i]);
            }
        }
        //do something here with array, then free it.
        free(array);
    }

    return 0;

}

答案 1 :(得分:1)

看看documentation of scanf。您可以使用函数的返回值来确定读取整数是否成功。因此你可以做类似

的事情
while (scanf("%d") > 0) {
  // do stuff
}

答案 2 :(得分:1)

这将一次读取整数一位数并保存到数字的每个元素。 &#34;%1D&#34;将scanf限制为一个字符。这样,就没有必要用空格分隔数字。

#include<stdio.h>
#include<windows.h>
int n,number[10];
int main()
{
    int i = 0;
    printf("Enter Number of integer : \n");
    if ( ( scanf("%d",&n)) == 1)
    {
        printf ( "Enter integer : \n");
        i = 0;
        while ( i < n && ( ( scanf ( "%1d", &number[i])) == 1))
        {
            printf ( "scanned %d into number[%d]\n", number[i], i);
            i++;
            if ( i >= 10)
            {
                printf ( "stopping at ten digits\n");
                break;
            }
        }
    }
    system("pause");
}

答案 3 :(得分:1)

考虑到另一种可以提供极大灵活性的选择是将输入读作字符而不是数字。特别是在将个别数字读入数组时。这使您可以完全控制逐个字符地解析输入并以您喜欢的任何方式进行响应。一个简单的例子:

#include <stdio.h>

#define MAXI 10

int main (void) {

    int i = 0;
    int c = 0;
    int n = 0;
    int numbers[MAXI] = {0};

    printf ("\n Enter a number: ");
    while ((c = getchar()) != EOF && c != '\n')
    {
        if (c >= '0' && c <= '9')
        {
            numbers[n] = c - '0';
            n++;
            if (n == MAXI)
                break;
        }
    }

    printf ("\n The numbers entered are: ");
    for (i = 0; i < n; i++)
        printf ("%d", numbers[i]);
    printf ("\n\n");

    return 0;
}

<强>实施例

$ ./bin/scanf_multi_ints <<<$( printf "01234567890\n" )

 Enter a number:
 The numbers entered are: 0123456789

$ ./bin/scanf_multi_ints <<<$( printf "0 1 2 3 4 5 6 7 8 9 0\n" )

 Enter a number:
 The numbers entered are: 0123456789

$ ./bin/scanf_multi_ints

 Enter a number: 01234567890

 The numbers entered are: 0123456789

$ ./bin/scanf_multi_ints

 Enter a number: 01abc234dog5 6 and 7 more 8 dogs 90

 The numbers entered are: 0123456789

这里的数字可以任何方式输入。中间有空格。没有。用干预的字母或单词。你可以决定。从字符到数字的转换是十进制48(0x30十六进制)的简单减法。

答案 4 :(得分:1)

最好使用fgets()。然而,在scanf("%d", &some_int)之前预先阅读前导空格也可以起作用。寻找'\n'

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>

// Scan & toss all white-space.  Return 1 on \n or EOF, else return 0
static bool EatWhiteSpaceUntilEOL(FILE *inf) {
  int ch;
  do {
    ch = fgetc(inf);
    if (ch == '\n' || ch == EOF)
      return true;
  } while (isspace(ch));
  ungetc(ch, inf);
  return false;
}

// Return number of `int` read.  Set *eol true if \n or EOF encountered.  
size_t Read_int(FILE *inf, int *dest, size_t n, bool *eol) {
  for (size_t i = 0; i < n; i++) {
    *eol = EatWhiteSpaceUntilEOL(inf);
    if (*eol) {
      return i;
    }
    if (fscanf(inf, "%d", &dest[i]) != 1) {
      return i;
    }
  }
  *eol = EatWhiteSpaceUntilEOL(inf);
  return n;

}

int main(void) {
  int n;
  printf("Enter maximum number of `int` to read: ");
  bool eol;
  if (Read_int(stdin, &n, 1, &eol) != 1 || !eol) {
    return EXIT_FAILURE;
  }

  int *a = calloc(n, sizeof *a);
  size_t count = Read_int(stdin, a, n, &eol);
  printf("Count:%zu First:%d Last:%i  Done:%s\n", count, a[0], a[count - 1],
      eol ? "Yes" : "No");
  free(a);
  return 0;
}