==
сравнивает ссылки на объекты в Java и не является исключением для объектов String
.
Для сравнения фактического содержимого объектов (в том числе String
) необходимо использовать equals
.
Если сравнение двух объектов String
с использованием ==
оказывается true
, это связано с тем, что объекты String
были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String
. Не следует ожидать сравнения одного объекта String
, содержащего то же содержимое, что и другой объект String
, используя ==
для оценки как true
.
Функция scanf()
автоматически удаляет пробелы, прежде чем пытаться проанализировать преобразования, отличные от символов. Исключение составляют форматы символов (в основном %c
, а также наборы сканирования %[…]
- и %n
); они не удаляют пробелы.
Используйте " %c"
с ведущим пробелом, чтобы пропустить дополнительное пустое пространство. Не используйте конечную заготовку в строке формата scanf()
.
Обратите внимание, что это все еще не потребляет никаких конечных пробелов, оставшихся во входном потоке, даже до конца строки, поэтому остерегайтесь что если также использовать getchar()
или fgets()
в том же входном потоке. Мы просто получаем scanf, чтобы пропускать пробелы до , например, для %d
и других несимвольных преобразований.
Обратите внимание, что не-пробелы " директивы "(использовать терминологию POSIX scanf ), отличную от преобразований, например, буквальный текст в scanf("order = %d", &order);
также не пропускает пробелы. Литерал order
должен соответствовать следующему символу, который нужно прочитать.
Итак, вы, вероятно, захотите " order = %d"
там, если хотите пропустить новую строку из предыдущей строки, но по-прежнему требуется литеральное совпадение на фиксированном string, как этот вопрос .
Используйте scanf(" %c", &c2);
. Это решит вашу проблему.
Используйте getchar()
перед вызовом второго scanf()
.
scanf("%c", &c1);
getchar(); // <== remove newline
scanf("%c", &c2);
%c
,%n
,%[]
- 3 указанных ожидания, которые не занимают ведущих пробелов. – chux 12 December 2015 в 04:12scanf()
format иscanf()
с запросом дважды для ввода, пока я ожидаю, что он спросит только один раз для обсуждения завершающих пробелов в строках формата. Они плохая идея - поразительно плохо, если вы ожидаете взаимодействия с человеком и плохо для взаимодействия с программой. – Jonathan Leffler 17 October 2017 в 05:28