如果每次都没有,如何使用scanf读取c中的输入。投入正在发生变化

时间:2016-01-12 09:38:31

标签: c

我必须阅读不同的不。在一种情况下读取两个整数的输入,在另一种情况下读取整数等等

以下是我想要实现的输入类型。这个例子有6行。

示例输入

1 1 1 2
1 1 2 5
1 2 3 4
2 3
2 4
1 5 5 4

我的代码

#include <stdio.h>

typedef long long int LLI;

int main(void) 
{


 LLI n,q,i,j,w,x,y,z,t;
 scanf("%lld %lld",&n,&q);
 LLI d[n],s[n];
 for(i=0;i<q;i++)
 {  
      // I don't know how to do this? The code below is what I have tried:
      scanf("%lld %lld %lld %lld",&w,&x,&y,&z); 
      printf("%lld %lld %lld %lld \n",w,x,y,z);
 }  
 return 0;
}

示例输入

5 14

1 1 1 2

1 1 2 5

1 2 3 4

1 2 4 7

2 3

2 4

1 5 5 4

2 5

2 6

1 7 5 8

2 7

2 8

2 9

2 10

3 个答案:

答案 0 :(得分:2)

如果您的代码仅在Linux,BSD和Mac OS X等POSIXy系统上运行,则使用fgets()(或getline()来读取每一行。第一行将包含包含数据的行数。

要处理每一行(具有不同数量的值),您可以sscanf()%n一起使用来确定消费的字符数,strtol()strtoul()strtod()。在所有情况下,您尝试转换一个值,跟踪成功转换消耗原始字符串的数量,相应地推进字符串的开始以进行下一次转换。重复直到转换失败。 (然后,您可以检查转换是否因字符串结尾而失败,或者该行是否包含非值数据,即垃圾或注释。)

答案 1 :(得分:0)

使用 int array 可以读取多个输入。堆栈溢出How can I read a varying amount of integer input in C?

的参考链接

示例示例:

#include <stdio.h>

int main()
{
    int ele,num,i;
    printf("Enter the elements...\n");
    scanf("%d",&ele);
    int arr[ele];
    for (i=0; i<ele;i++)
    {
            scanf("%d",&num);
            arr[i] = num;
    }
}

答案 2 :(得分:0)

首先,您可以动态地将指针数组分配给int。

例如

size_t nRows = 0;

scanf( "%zu", &nRows );

int **a = malloc( nRows * sizeof( int * ) );

然后,您可以为数组中的每个“行”分配一个指针,该指针将指向将包含行中元素数量的对象

for ( size_t i = 0; i < nRows; i++ )
{
    a[i] = calloc( 1, sizeof( int ));
} 

最后,当你要连续读取数字时,你需要使用realloc并增加第一个元素。

这就是每一行都有这个结构

number_of_elements_in the_row, number1, number2, ...

另一种方法是使用具有灵活数组的动态分配的结构数组。例如

struct row { size_t n; int values[]; };
size_t nRows = 0;

scanf( "%zu", &nRows );

row *a = malloc( nRows * sizeof( row ) );