将C控制台输入到整数中



i具有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;

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

#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] : %dn", 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] : %dn", 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

看事物,让我知道您是否还有其他问题。

您的代码中发生了许多事情。这是从标准输入中读取可变大小数组的一个基本示例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int n;
  int *xs;
  /* read n */
  if (!scanf( "%d", &n ) || (n <= 0))
  {
    fprintf( stderr, "%sn", "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 integersn", n );
    return 1;
  }
  /* read xs[] */
  { 
    int i;
    for (i = 0; i < n; i++)
      if (!scanf( "%d", &(xs[i]) ))
      {
        fprintf( stderr, "%sn", "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 );
}

这应该可以帮助您步入正轨。

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

  • 铸造到(int*)不是C中的必要,而是:它:
    • 声明意图
    • 可以使用C 编译器编译而没有错误
  • 添加了非常简单的错误处理
    ("狗"现在拒绝被接受为输入)
  • 添加了newline。请注意,使用fflush()完全符合POSIX。POSIX仅要求该终端默认值在Newline上冲洗。没有新线→需要冲洗。管道归档→请冲洗。

相关内容

  • 没有找到相关文章