简体   繁体   English

如何在C中读取2行整数输入?

[英]How to read 2 lines of integer input in C?

I'm doing a project for my algorithms class and I'm having a lot of trouble with inputs. 我正在为我的算法课程做一个项目,输入时遇到很多麻烦。 I'm trying to read an input like this: 我正在尝试读取这样的输入:

6 0 2 3 1 3
5 9 2 1 3

The integers will need to go to 整数将需要转到

int num1; // num1 = 6
int num2; // num2 = 5
int array1[100]; // array1 = {0, 2, 3, 1, 3, 0, 0, ...}
int array2[100]; // array2 = {9, 2, 1, 3, 0, 0, ...}

The input will come from standard input, in the form of a file. 输入来自文件格式的标准输入。 So in terminal running the program would look like this: 因此,在终端中运行程序将如下所示:

cat input.txt | ./a.out

Where input.txt contains the two lines of integers. 其中input.txt包含两行整数。

Here is my flawed attempt so far: 到目前为止,这是我的错误尝试:

while(scanf("%d%c", &temp, &ch) > 1){
    if (ch != '\n'){
        one[count] = temp;
    } 
    else if (ch == '\n'){
        count = 0;
        two[count] = temp;

    }
    one[count] = temp;
    count++;
    if (ch != ' ')
    {
        printf("Invalid input. Please do int + space.\n");
        return -1;
    }
    if ((temp >= 100) || (temp <= -100))
    {
        printf("Input is too big, must be between -100, 100.\n");
        return -1;
    }
    if (one[0] < 1){
        printf("Input for n cannot be smaller than one!");
        return -1;
    }
}

I think the main issue is that I'm just not sure how to deal with multiple lines of input. 我认为主要的问题是我不确定如何处理多行输入。 One line of input is fine by me but multiple lines is what trips me over. 一行输入对我来说很好,但多行是让我绊倒的原因。

You could fetch an entire line of input using the getline function and then iterate over that line, scanning one number at a time using the strtol function. 您可以使用getline函数获取整个输入行,然后遍历该行,并使用strtol函数一次扫描一个数字。

From the example in your question I assume that you want all remaining entries in the two arrays to be zero so don't forget to zero them out (either manually or using the memset function.). 从问题的示例中,我假设您希望两个数组中的所有剩余条目均为零,因此不要忘记将它们归零(手动或使用memset函数)。

And also don't forget to free() the buffer getline gave you. 并且也不要忘记free()缓冲区getline给您。

Look at my code below. 看下面的代码。 Maybe it helps you. 也许对您有帮助。

Generally, if you know how many numbers will be inputted, you can read numbers one by one using scanf("%d", ...) and use fflush() when the expected amount is met to clear any other numbers in the buffer. 通常,如果您知道要输入多少个数字,则可以使用scanf("%d", ...)来逐一读取数字scanf("%d", ...)并在达到预期数量时使用fflush()清除缓冲区中的其他任何数字。 This example assumes that the first two numbers are the respective lengths of each line. 此示例假定前两个数字是每行的相应长度。 The input could look like: 输入看起来像:

// example input:
// 4
// 3
// 1 2 3 4
// 5 6 7
    int main()
    {
        int it;
        int it1 = 0;
        int it2 = 0;
        int line1[100];
        int line2[100];

        scanf("%d", &it1); // amount of line 1 numbers
        scanf("%d", &it2); // amount of line 2 numbers

        it = 0;
        do
        {
            scanf("%d", &line1[it]);
        } while (++it < it1);

        fflush(stdin); // clear input buffer

        it = 0;
        do
        {
            scanf("%d", &line2[it]);
        } while (++it < it2);

        return 0;
    }

Actually I ended up using scanf, here is the working code below. 实际上,我最终使用了scanf,这是下面的工作代码。 It really helped to read some of these comments and also refer to K&R 阅读这些评论并参考K&R确实有帮助

#include <stdio.h>
#include <string.h>

#define ARRAY_SIZE  100

void shiftArrayBackByOne(int a[]){
    for(int i = 1; i <= ARRAY_SIZE; i++){
        a[i - 1] = a[i];
    }
}

void printArray(int a[], int n){
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }
    putchar('\n');
}

int main(){
    int isLineTwo = 0;
    int countOne = 0;
    int countTwo = 0;
    int inputNum;
    int num1;
    int num2;
    int array1[ARRAY_SIZE];
    int array2[ARRAY_SIZE];

    char ch;

    while(scanf("%d%c", &inputNum, &ch) > 0){

        //Puts the input into different arrays depeding
        //on value of isLineTwo
        if (isLineTwo){
            array2[countOne] = inputNum;
            countOne++;
        } else {
            array1[countTwo] = inputNum;
            countTwo++;
        }

        //Increment isLineTwo if ch is a 'newline'
        if (ch == '\n')
        {
            isLineTwo++;
        }

        //Check if user inputs more than 2 lines
        if (isLineTwo > 1){
            printf("Hey, no more than 2 input lines!\n");
        }

    }
    printArray(array1, countOne);
    printArray(array2, countTwo);

    num1 = array1[0];
    num2 = array2[0];

    shiftArrayBackByOne(array1);
    shiftArrayBackByOne(array2);

    printf("num1 = %d\n", num1);
    printf("num2 = %d\n", num2);

    printArray(array1, countOne);
    printArray(array2, countTwo);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM