为什么我的C程序要求的输入多于应该的?额外的输入甚至没有做任何事情

时间:2012-03-01 16:26:59

标签: c matrix

该部分的代码,如果你想编译它,请在下面。

基本上我必须将以下数据输入到程序中:

4 5
12 5 7 0 -3
9 11 2 5 4
0 -5 9 6 1
2 12 93 -15 0
5 3
7 1 31
0 0 5
-5 -3 2
9 41 11
0 13 31

前4 5& 5 3表示第一和第二矩阵的维数,而后面的数据是矩阵的数据。

问题是,当我复制并粘贴它时,它会在之后要求再输入一次,当我输入任何内容(比如84)时,它可以完美地工作(输出方式),并且84似乎什么都不做。为什么要求这个额外的?

#include <stdio.h>

int main(int argc, char *argv[]) {
    int rows1 = 1, columns1 = 1, rows2 = 1, columns2 = 1;    // variables for number of rows and columns in each matrix 
        int i, j, k;                                             // loop variables 

        // These will affect the loop's length
        scanf("%d %d", &rows1, &columns1);
        int matrix1[rows1][columns1];
        for (i = 0; i < rows1; i++) {
            for (j = 0; j < columns1; j++) {
                scanf("%d ", &matrix1[i][j]);
            }
        }


        scanf("%d %d", &rows2, &columns2);
        int matrix2[rows2][columns2];
        for (i = 0; i < rows2; i++) {
            for (j = 0; j < columns2; j++) {
                scanf("%d ", &matrix2[i][j]);
            }
        }
}

3 个答案:

答案 0 :(得分:5)

你的上一次扫描需要2件事

                scanf("%d ", &matrix[i][j]);
                //     112

事物1是整数
事物2是空白的零或更多

如果您向scanf提供“31”(或“31”或“31 \ n”),则需要更多空白。 一旦你提供“84”,它就知道空白已经结束并继续执行程序。


建议:从scanf转换说明符中删除所有空格:scanf("%d%d")很好! "%d"转换说明符已删除数字前的空格。

更好的是,使用fgets()读取数据并使用sscanf()

进行解析

答案 1 :(得分:2)

行为是由于:

中的空格
scanf("%d ", &matrix1[i][j]);
scanf("%d ", &matrix2[i][j]);

将格式说明符更改为:

scanf("%d", &matrix1[i][j]);
scanf("%d", &matrix2[i][j]);

(嗯,这只是第二个重要的,但你可以保持它们相同。)

格式说明符中的空格匹配输入中的一个或多个空格。运行代码后,最终的scanf()会在stdin处读取,直到遇到非空白字符(8中的84),此时它会返回并且你的课程结束了。

答案 2 :(得分:1)

我认为发生的事情是你在使用时在整数之后指定了空格 scanf("%d ", &matrix2[i][j]);。使用scanf时,默认情况下%d会忽略空格。但是,您指定了一个空格,因此当它到达文件的末尾并看到一个没有空格的整数时,它不会看到任何与您的格式化输入相匹配的内容。输入新整数后,您还会在满足输入格式的最后一个数字后面添加一个空格。所以它不是你需要的数字,而是空白。