将c控制台输入拆分为整数

时间:2017-09-28 03:01:56

标签: c segmentation-fault scanf fgets

我有一个控制台输入空格分隔的n个整数的整数列表(n通过控制台读入),需要将其拆分为整数并放在大小为n的数组中。我用fscan和fgets尝试了这个,分段错误或控制台锁定,不让我进入列表。任何建议:

int main()
{
        int n;
        scanf("%d", &n);
        int buffer = n + n -1;
        char input[buffer];
        //char * input;
        //int buffer = n+n-1;
        //fgets(input, buffer, stdin);
        scanf("%*c", &input);
        printf("c is %c", input[0]);
        char * end;
        long int l;
        end = input;
        int base = 10;
        int ele = 0;
        long int vals[n];
        while(l = strtol(end, &end, base)){
                vals[ele] = l;
                ele += 1;
        }
        return 0;

2 个答案:

答案 0 :(得分:0)

您的代码中有很多内容。以下是从标准输入读取可变大小数组的基本示例:

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

int main()
{
  int n;
  int *xs;

  /* read n */
  if (!scanf( "%d", &n ) || (n <= 0))
  {
    fprintf( stderr, "%s\n", "invalid n: n <= 0 or n is not an integer" );
    return 1;
  }

  /* allocate xs[n] */
  xs = (int*)malloc( n * sizeof(int) );
  if (!xs)
  {
    fprintf( stderr, "failure to allocate %d integers\n", n );
    return 1;
  }

  /* read xs[] */
  { 
    int i;
    for (i = 0; i < n; i++)
      if (!scanf( "%d", &(xs[i]) ))
      {
        fprintf( stderr, "%s\n", "invalid x: x is not an integer" );
        free( xs );
        return 1;
      }
  }

  /* ... */

  /* print xs[] in reverse order */
  {
    int i = n;
    while (i--)
      printf( "%d ", xs[i] );
    puts( "" );        // Here's your newline
    fflush( stdout );  // POSIX only mandates flush to terminal, and only by default
  }

  free( xs );
}

这可以帮助你走上正轨。

[编辑] 根据下面的评论修改:

  • 在C中转换为(int *)不是必需的,但它:
    • 声明意图
    • 可以使用C ++编译器编译而无错误
  • 添加了非常简单的错误处理
    (“狗”现在拒绝接受作为输入)
  • 添加换行符。请注意,使用fflush()完全符合POSIX标准。 POSIX仅强制终端默认刷新换行符。没有新行→需要刷新。管道到文件→请冲洗。

答案 1 :(得分:0)

您的编译器是否支持可变长度数组扩展:

#include <stdio.h>

int main (void) {

    int n, tmp, ndx = 0;
    if (scanf ("%d", &n) != 1 || n < 1) {
        fprintf (stderr, "error: invalid input - n.\n");
        return 1;
    }
    int a[n];

    while (ndx < n && scanf ("%d", &tmp) == 1) {
        a[ndx] = tmp;
        printf ("a[%3d] : %d\n", ndx, a[ndx]);
        ndx++;
    }

    return 0;
}

或者您选择动态分配数组:

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

int main (void) {

    int n, *a, tmp, ndx = 0;
    if (scanf ("%d", &n) != 1 || n < 1) {
        fprintf (stderr, "error: invalid input - n.\n");
        return 1;
    }

    if (!(a = calloc (n, sizeof *a))) { /* allocate/validate */
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

    while (ndx < n && scanf ("%d", &tmp) == 1) {
        a[ndx] = tmp;
        printf ("a[%3d] : %d\n", ndx, a[ndx]);
        ndx++;
    }

    free (a);   /* don't forget to free allocated memory */

    return 0;
}

始终,始终验证所有用户输入(在将转化中的值分配给您的数组之前)scanf仅为此目的而返回。您必须以某种方式处理匹配的输入失败。

示例输入

$ cat dat/n_10_ints.txt
10
8572
-2213
6434
16330
3034
12346
4855
16985
11250

示例使用/输出

$ ./bin/readnints <dat/n_10_ints.txt
a[  0] : 8572
a[  1] : -2213
a[  2] : 6434
a[  3] : 16330
a[  4] : 3034
a[  5] : 12346
a[  6] : 4855
a[  7] : 16985
a[  8] : 11250
a[  9] : 1495

仔细看看,如果您有其他问题,请告诉我。