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上冲洗。没有新线→需要冲洗。管道归档→请冲洗。