我有一个控制台输入空格分隔的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;
答案 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 );
}
这可以帮助你走上正轨。
[编辑] 根据下面的评论修改:
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
仔细看看,如果您有其他问题,请告诉我。