Подтвердить что ты не робот

Каков эффект завершения пробела в строке формата scanf()?

В чем разница между scanf("%d") и scanf("%d ") в этом коде, где различие является завершающим пустым в строке формата?

#include <stdio.h>

int main(void)
{
    int i, j;

    printf("enter a value for j ");
    scanf("%d  ",&j);
    printf("j is %d\n", j);
    printf("enter a value for i ");
    scanf("%d", &i);
    printf("i is %d\n", i);
    return 0;
}

Как работает функция scanf(), когда я добавляю пробелы после спецификатора формата, например scanf("%d ", &j);?

4b9b3361

Ответ 1

Символьный пробел в формате scanf заставляет его явно читать и игнорировать как можно больше пробельных символов. Таким образом, после scanf("%d ", ..., после прочтения числа, он будет продолжать читать символы, отбрасывая все пробелы, пока не увидит на символе символ без пробелов. Этот символ без пробелов останется в качестве следующего символа, который будет считаться функцией ввода.

С кодом:

printf("enter a value for j ");

scanf("%d  ",&j);

printf("j is %d \n", j);

он напечатает первую строку, а затем дождитесь, пока вы введете номер, а затем продолжайте ждать чего-то после номера. Поэтому, если вы просто наберете 5 Enter, он будет виден - вам нужно набрать еще одну строку с некоторым символом без пробелов, чтобы продолжить. Если вы затем наберете 6 Enter, это станет значением для i, поэтому ваш экран будет выглядеть примерно так:

enter a value for j 5
6
j is 5
enter a value for i i is 6

Кроме того, поскольку большинство scanf% -конверсий также пропускают ведущие пробелы (все, кроме %c, %[ и %n), пробелы перед% -конверсиями несущественны ("%d" и " %d" будут действовать одинаково). Поэтому, по большей части, вы должны избегать пробелов в scanf-конверсиях, если не знаете, что они вам особенно нужны для их особого эффекта.

Ответ 2

Символ белого пробела (пробел, новая линия, горизонтальная и вертикальная вкладка) в строке формата соответствует любому количеству символов пробела во входном файле.
В вашем первом случае

  scanf("%d  ",&j);

когда он встречает пробел char (WSC) ' ', тогда он будет использовать все белые пробелы, вводимые пользователем, включая \n при нажатии Enter, и ожидается, что он войдет в не-WSC. В этом случае ваша программа завершится, нажав Ctrl + Z.

Ответ 3

Символ пробела в вашем формате scanf соответствует любому количеству пробельных символов, как описано в isspace. Поэтому, если у вас есть хвостохранилища, новые линии, табуляторы или любой другой символ пробела, тогда он также будет потребляться scanf, прежде чем он вернется.

Ответ 4

Разница (хотя и очевидна) - это другая строка формата. Если вы введете следующую строку:

"3  "

scanf() вернется успешно. В противном случае это зависит от вашего ввода. scanf() существенно пропускает пробелы (вкладки, пробелы, символы новой строки) и выполняет поиск буквенно-цифровых значений во входном потоке. Так как это завершающее пробел, он становится сосредоточенным в конце символа новой строки в конце ввода при нажатии ENTER, поэтому он имеет мало последствий.

scanf() ожидает, что введенный ввод точно соответствует строке формата, которую вы ему предоставляете, за исключением того, что смежные пробельные символы сжимаются до одного символа пробела. Это становится очень важным, если вы хотите разбирать большие строки данных с его эквивалентом строковой обработки, sscanf().

Хорошее упражнение для дальнейшего тестирования будет выглядеть примерно так:

#include<stdio.h>

int main(void)
{
   int a=0,b=0,c=0;

   printf("Enter values for A, B, C, in the format: \"A B  -  C\"\n");
   scanf("%d %d  -  %d", &a, &b, &c);

   printf("Values: A:%d, B:%d, C:%d\n", a, b, c);
}

Затем проверьте и проверьте, что значения этих целых чисел после предоставления как правильно, так и неправильно отформатированных утешенных входных данных (то есть: пробелы и дефисы). Вот несколько примеров. Первый использовал неправильный ввод, второй - правильно отформатированный вход. Обратите внимание, что в первом случае C даже не устанавливается, поскольку scanf() предоставит непредвиденное поведение, если строки ввода и строки формата не совпадают. В общем, вам лучше использовать что-то вроде fgets(), чтобы получить строку ввода от пользователя, а затем использовать различные функции поиска (то есть: strstr(), strch(), strcat, strcpy и т.д.), Чтобы проанализировать вашу строку, так как это намного безопаснее, чем просто использование scanf() и при условии, что пользователь не допустит ошибку, случайно или намеренно.

Enter values for A, B, C, in the format: "A B  -  C"
1 2 3
Values: A:1, B:2, C:0

Enter values for A, B, C, in the format: "A B  -  C"
1 2  -  3
Values: A:1, B:2, C:3

Теперь рассмотрим один последний прогон: вы увидите, что scanf() объединяет несколько последовательных символов пробелов в один символ, поэтому почему эти окончательные прогоны действительно успешны:

Enter values for A, B, C, in the format: "A B  -  C"
1 2 - 3
Values: A:1, B:2, C:3

Enter values for A, B, C, in the format: "A B  -  C"
1     2           -                     3
Values: A:1, B:2, C:3