读取多行输入并将int保存到数组中

时间:2017-10-27 18:10:06

标签: c scanf

我正在尝试将一些int保存到从用户输入中读取的数组中。我不知道每一行int的数量,只知道该行的最大数量int的行数。例如,如果这是5,则用户应输入5行int,每行最多5个元素。价值观将是积极的。我做错了什么?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int n;
    scanf("%d",&n);
    int array_row[n];
    int i=0;
    int noEnter=n;
    //My idea is when in getchar() there is a enter it means that the user wants to go to the next line so decrement noEnter with 1 and also store a value -1 which tells me that that was the end of the line
    while(noEnter!=0){
        int c;
        if(scanf("%d",&c)==1){
            array_row[i]=c;
            i++;
            continue;
        }
        char d=getchar();
        if(d=='\n'){
            array_row[i]=-1;
            i++;
            noEnter--;
            continue;
        }
    }



    for(int i=0;i<n*n;i++){
        printf("%d ",array_row[i]);
    }

    return 0;
}

输入示例:

5
4
4 35 65
4 32
2 222 4 5 6
4

输出:

4 -1 4 35 65 -1 4 32 -1 2 222 4 5 6 -1 4 -1

2 个答案:

答案 0 :(得分:2)

scanf不会像您期望的那样停留在\n。它正在读取整数...结果我猜你的程序甚至没有结束。读一行并将其分成整数。这样你就可以获得整数并相应地处理它们。

由于输入的整数数目未知,您可以对行strtok进行标记,然后将每个数字从字符串转换为int

此外,您的输入不符合给定的输出。你已经在第一行给出了输入5,但它从未出现在前几个数字的输出中。

#define LINE 100
..

int len=0;
char line[LINE];
char*word;
while(noEnter<5){
    fgets(line,LINE,stdin);
    word=strtok(line," \n");
    if(word == NULL) 
         break;
    while(word != NULL){
        int p=atoi(word);
        array_row[len++]=p;
        word=strtok(NULL," \n");
    }
    noEnter++;
    array_row[len++]=-1;
}

scanf由执行  读取输入到第一个非空白字符(仍然是  未读),或直到不再能读取任何字符。

此处,您甚至无法在\n之前使用getchar()消费\n scanf() #include <stdio.h> #include <stdlib.h> #include <string.h> #define LINE 50 int main(int argc, char *argv[]) { int n=5; int array_row[LINE]; int len=0; int noEnter=3; char line[LINE]; char*word; while(noEnter<5){ fgets(line,LINE,stdin); word=strtok(line," \n"); if(word == NULL) break; while(word != NULL){ int p=atoi(word); array_row[len++]=p; word=strtok(NULL," \n"); } noEnter++; array_row[len++]=-1; } for(int i=0;i<len;i++){ printf("%d ",array_row[i]); } return 0; } 消耗并丢弃{{1}}。

{{1}}

答案 1 :(得分:0)

scanf的一个主要问题是它对于读取换行符位置(与其他空格相对)很重要的数据没有用。 Scanf只会破坏空格上的内容,空格,制表符和换行符之间没有区别,所以5行数和5行数之间没有区别。

因此,如果您关心换行符,通常需要使用fgets将行读入缓冲区,然后使用sscanf来解析该行中的数字。