Вопрос по input, c, stdio, scanf, whitespace – пробел в строке формата (scanf)

9

Рассмотрим следующий код:

#include
int main() {
    int i=3, j=4;
    scanf("%d c %d",&i,&j);
    printf("%d %d",i,j);
    return 0;
}

Это работает, если я дам2c3 или же2 c 3 или же2c 3 в качестве входных данных, если мне нужно изменить значение переменных. Что мне делать, если я хочу, чтобы пользователь вводил тот же шаблон, что и я, значит, если%dc%d только тогда2c3 приемлемо и не2 c 3 и наоборот, если это так?%d c %d

Ваш Ответ

4   ответа
0

Сначала запустите анализ строки:

char a[100], b[100];
scanf("%99s c %99s", a, b);

Затем используйте sscanf () для преобразования строк в int.

0

что я бы прочитал результат scanf в разные переменные (т.е. не использовать повторноi а такжеj) как"%d%s%d", Затем проверьте строку, полученную из% s, и, если она соответствует вашим требованиям, используйте другие переменные, чтобы перезаписать i и j.

10

Пробелы в строке формата соответствует 0 или более пробельных символов на входе.

Так"%d c %d" ожидает число, затем любое количество пробельных символов, затем символc, затем любое количество пробельных символов и другое число в конце.

"%dc%d" ожидает количество,c, число.

Также обратите внимание, что если вы используете* в строке формата он подавляет присваивание:

%*c = читать 1 символ, но неприсвоить его любой переменной

Так что вы можете использовать"%d%*c c%*c %d" если хотитесила пользователь должен ввести: число, не менее 1 символа, за которым следует любое количество пробельных символов,cне менее 1 символа, за которым следует любое количество пробельных символов и число.

Этот ответ неверно подразумевает, что пробел не допускается перед целым числом."%dc%d" ожидает любое количество пробельных символов, число,'c', любое количество пробельных символов, число. chux
Хотя это правильно, это нена самом деле не отвечайте на вопрос о том, как действовать, если вы хотите настаивать на пробелах или без пробелов. Vicky
4

Если вы хотите принять1c2 но нет1 c 2, используйте шаблон без пробела:

scanf("%dc%d", &x, &y);

Если вы хотите принять1c2 а также1 c 2 (а также1 \t \t c \t 2 и т.д.), используйте шаблон с пробелом:

scanf("%d c %d", &x, &y);

Если вы хотите принять1 c 2 но нет1c2, добавьте поддельную строку, содержащую пробел:

scanf("%d%*[ \t]c%*[ \t]%d", &x, &y);

Здесь строка формата%[ \t] будет означатьпрочитать строку, содержащую любое количество пробелов и символов табуляции "; но используя дополнительный*, это становится "ожидать строка, которая содержит любое количество пробелов и символов табуляции; затемоткажитесь от этого "

Пространство перед"%d" в"%d c %d" не имеет значения - тот же результат, что и"%d c%d", Пробелы будут приемлемы даже без этого ведущего пространства. chux

Похожие вопросы