У меня возникли проблемы с использованием функции сканирования в C

#c #scanf

Вопрос:

Здесь, если вы использовали два спецификатора формата в функции сканирования, но это происходит только после взятия трех чисел, хотя сохраняются только два числа.Я не знаю, почему он ждет ненужного 3-го числа.

 #include <stdio.h>

int main(){

    int a ,b ;
    printf("Enter values of a and b ");
    scanf(" %d %d " , amp;a ,amp;b );
    printf("a = %d b = %d" ,a ,b);


    return 0;
}
 

Комментарии:

1. Без видимой причины у вас возникли проблемы, хотя if (scanf ("%d %d", amp;a ,amp;b) != 2) { fputs ("error: invalid integer input.n", stderr); return 1; } вы добавили проверку и удалили ненужное пространство из строки формата. было бы лучше.

2. Почти уверен, что конечный пробел означает «потребляйте пробелы до тех пор, пока не будет обнаружен пробел, и только затем возвращайтесь».

3. Кстати: в общем, вы обнаружите, что все намного проще, если вы используете getline followed by sscanf . Таким образом, у вас будет больше контроля над тем, что происходит, когда пользователь нажимает enter.

4. Или, по крайней мере fgets() , с буфером соответствующего размера (массив символов), а затем sscanf() с использованием буфера в качестве первого аргумента. ( fgets() вместо getline() того, чтобы устранять необходимость free() в выделенном буфере) Единственным недостатком fgets() or getline() является то, что оба значения должны быть введены в одной строке. При scanf() этом они могут быть разделены таким количеством пустых строк, как вам нравится.

5. изменить scanf(" %d %d " , amp;a ,amp;b ); на scanf("%d %d", amp;a ,amp;b );

Ответ №1:

почему он ждет ненужного 3-го числа.

" %d %d " указывает scanf() дождаться некоторого небелого пробела после 2 int , чтобы узнать, что все конечные пробелы заполнены.

" %d %d" приказывает scanf() вернуться после 2 int .

Начальное пространство и второе на самом деле избыточны, так %d как считывает и игнорирует пробелы перед числом, поэтому вы можете просто написать:

     scanf("%d%d", amp;a, amp;b);
 

но вы также должны проверить, что scanf() возвращает 2 данные, указывающие на 2 успешных преобразования.

Вот измененная версия:

 #include <stdio.h>

int main() {
    int a, b;
    printf("Enter values of a and b: ");
    if (scanf("%d%d", amp;a, amp;b) == 2) {
        printf("a = %d, b = %dn", a, b);
    } else {
        printf("invalid inputn");
    }
    return 0;
}
 

Ответ №2:

у меня нет этой проблемы, когда я вставляю код в эту ссылку https://c.runoob.com/compile/11

Комментарии:

1. То есть stdin , вход заканчивается.