получает функцию в C, не ожидая ввода

У меня есть вопрос, который я хочу задать о функции gets.

В настоящее время я пишу программу сложения 2 матриц, и я запутался в поведении функции gets. Из того, что я прочитал в описании от tutorialspoint о функции gets() в c, сказано, что "функция gets вернет str в случае успеха и NULL в случае ошибки или когда произойдет конец файла, когда символы не были прочитаны".

for (matrix_number = 0; matrix_number < 2; matrix_number++)
{
    if (matrix_number == 0) { printf("MATRIX A\n"); }
    else { printf("MATRIX B\n"); }

    // dim = the dimension of the matrix that the user inputted
    // Loop counter is for cycling through the matrix row, if dim is 3 then cycle 3x
    // The user will type in the data in a format like this 
    //        Type in the data for row 1 : 1 2 3
    //        1 is the value for the first row and first column for the matrix
    //        2 is the value for the first row and second column for the matrix and so on

    for (loop_counter = 1; loop_counter <= dim; loop_counter++)
    {
        char row_value[20], space[2] = " ", *value_token;

        printf("Type in the data for row %d :",loop_counter);
        gets(row_value);

        value_token = strtok (row_value,space);

        while (value_token!=NULL)
        {
            insert( atoi(value_token) , matrix_number); 
            // convert value_token from string to int type
            value_token = strtok (NULL,space);
        }
    }
}

Он компилируется, но когда я запускаю программу, я получаю что-то вроде этого

Welcome to the Matrix Addition Calculator Program!
Type in the dimension of the matrix : 3
MATRIX A
Type in the data for row 1 :Type in the data for row 2 :6 5 4
Type in the data for row 3 :3 2 1
MATRIX B
Type in the data for row 1 :1 2 3
Type in the data for row 2 :4 5 6
Type in the data for row 3 :7 8 9

Я не уверен, что происходит, для матрицы A ввод первой строки пропускается, но для матрицы B ввод первой строки не пропускается.

В настоящее время я использую gedit на elemtary luna для написания кода и gcc для его компиляции. Элементарная луна работает на виртуальной машине.

Спасибо всем, кто прочитал мой вопрос, если информации недостаточно, пожалуйста, дайте мне знать, надеюсь, кто-то может мне помочь, и большое спасибо! :)


person Chamoileon    schedule 03.10.2014    source источник
comment
В C нет функции gets .   -  person haccks    schedule 03.10.2014
comment
Попробуйте заменить gets(row_value) на fgets(rowvalue, 20, stdin). документация fgets здесь   -  person Jabberwocky    schedule 03.10.2014
comment
gets это плохая форма - если я наберу более 20 символов, это приведет к переполнению вашего буфера и сбою (или станет нарушением безопасности). Все еще не отвечает на ваш вопрос :(   -  person Andy Newman    schedule 03.10.2014
comment
Попробуйте сбросить stdin .   -  person Spikatrix    schedule 03.10.2014
comment
Не обращайте внимания на то, что сказал @CoolGuy. Даже не думайте об этом.   -  person haccks    schedule 03.10.2014
comment
Type in the dimension of the matrix : 3 для scanf("%d%*c", &dim);   -  person BLUEPIXY    schedule 03.10.2014
comment
@hacks, почему? Как указывали другие, в stdin есть символ \n.   -  person Spikatrix    schedule 03.10.2014
comment
@CoolGuy: fflush(stdin) надежно работает только в Windows; он не работает надежно в Unix, и стандарт C не определяет, что должно происходить. См. раздел Использование fflush(stdin).   -  person Jonathan Leffler    schedule 03.10.2014


Ответы (1)


scanf() вы используете для чтения 3 в:

Type in the dimension of the matrix : 3

оставляет новую строку во входном буфере. Следующий вызов gets() читает эту новую строку. Это стандартная проблема.

Кроме того, забудьте, что gets() существует. Он больше не является частью стандарта C. Он смертоносен и не может безопасно использоваться во враждебной среде. Предположим, что его использование приведет к сбою вашей программы — при неправильном вводе это произойдет, и вы ничего не можете сделать для защиты своего кода, кроме как избегать использования gets(). Вот почему он больше не является частью стандарта C.

Используйте fgets() или getline() вместо этого. Здесь это не имеет значения, но помните, что они включают новую строку в читаемую строку, в отличие от gets(), которая ее удаляет.

person Jonathan Leffler    schedule 03.10.2014
comment
Хорошо, сэр, я попробую еще раз, мое программирование на C все еще очень простое, и я мало знаю о стандартном вводе и стандартном выводе. Я постараюсь немного прочитать и посмотреть, будет ли проблема решена. Спасибо, сэр ! - person Chamoileon; 03.10.2014
comment
@Чамойлеон; Одна вещь, которую вы должны отметить о fgets, это то, что он читает \n и помещает его в массив назначения (забудьте, что я сказал в своем неправильном ответе). Таким образом, нет необходимости использовать \n, когда вы используете fgets повторно, пока длина входной строки не станет равной или не превысит длину целевого массива. - person haccks; 03.10.2014