Моя программа выполняется два раза, когда я делаю [дублировать]

Я думаю, что когда вы определяете String, вы определяете объект. Поэтому вам нужно использовать .equals(). Когда вы используете примитивные типы данных, вы используете ==, но с String (и любым объектом) вы должны использовать .equals().

49
задан Peter Mortensen 18 October 2017 в 17:53
поделиться

3 ответа

Функция scanf() автоматически удаляет пробелы, прежде чем пытаться проанализировать преобразования, отличные от символов. Исключение составляют форматы символов (в основном %c, а также наборы сканирования %[…] - и %n); они не удаляют пробелы.

Используйте " %c" с ведущим пробелом, чтобы пропустить дополнительное пустое пространство. Не используйте конечную заготовку в строке формата scanf().

Обратите внимание, что это все еще не потребляет никаких конечных пробелов, оставшихся во входном потоке, даже до конца строки, поэтому остерегайтесь что если также использовать getchar() или fgets() в том же входном потоке. Мы просто получаем scanf, чтобы пропускать пробелы до , например, для %d и других несимвольных преобразований.


Обратите внимание, что не-пробелы " директивы "(использовать терминологию POSIX scanf ), отличную от преобразований, например, буквальный текст в scanf("order = %d", &order); также не пропускает пробелы. Литерал order должен соответствовать следующему символу, который нужно прочитать.

Итак, вы, вероятно, захотите " order = %d" там, если хотите пропустить новую строку из предыдущей строки, но по-прежнему требуется литеральное совпадение на фиксированном string, как этот вопрос .

43
ответ дан Peter Cordes 16 August 2018 в 11:53
поделиться

Используйте scanf(" %c", &c2);. Это решит вашу проблему.

23
ответ дан Peter Mortensen 16 August 2018 в 11:53
поделиться

Используйте getchar() перед вызовом второго scanf().

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);
0
ответ дан 최지원 16 August 2018 в 11:53
поделиться
Другие вопросы по тегам:

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