Почему моя C-программа запрашивает еще один вход, чем должен?И дополнительный вход даже не делает ничего - PullRequest
2 голосов
/ 01 марта 2012

Код для этой части, если вы хотите скомпилировать его, приведен ниже.

В основном я должен взять следующие данные и ввести их в программу:

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 ]

5 голосов
/ 01 марта 2012

Ваше последнее сканирование требует 2 вещи

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

Вещь 1 - это целое число
Вещь 2 - это ноль или более пробелов

Если вы указали "31" (или "31"или" 31 \ n ") к scanf будет ожидаться больше пробелов.После того, как вы введете «84», он узнает, что пробел закончился и продолжает работу с программой.


Предложение: удалите все пробелы из спецификаторов преобразования scanf: scanf("%d%d") хорошо! Спецификатор преобразования "%d" уже удаляет пробелы перед числом.

Еще лучше, читать данные с fgets() и анализировать с sscanf()

2 голосов
/ 01 марта 2012

Поведение обусловлено пробелами в:

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

Измените спецификаторы формата на:

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

(Ну, это только второй, который имеет значение, но вы можетесохраняйте их идентичными.)

Пробел в спецификаторе формата соответствует одному или нескольким пробелам во входных данных.Когда ваш код запускается, последний scanf() сидит там, читая с stdin, пока не встретит непробельный символ (8 в 84), после чего он возвращается и ваша программа заканчивается.

1 голос
/ 01 марта 2012

Я думаю, что происходит то, что вы указали пробел после целого числа, когда использовали scanf("%d ", &matrix2[i][j]);.scanf игнорирует пробелы по умолчанию при использовании %d.Однако вы указали пробел, поэтому, когда он дойдет до конца файла и увидит целое число без пробела, за ним не будет ничего, что соответствует вашему форматированному вводу.После ввода нового целого числа вы также ставите пробел после последнего числа, удовлетворяющего форматированию ввода.Значит, нужен был не номер, а пробел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...