В этом выражении
s.c_str()==""
сравниваются два указателя (адреса). Первый - это указатель, возвращаемый s.c_str()
, а второй - указатель на первый символ (конечный нулевой символ) строкового литерала ""
.
Очевидно, что адреса разные (помните также, что строковый литерал имеет статическую длительность хранения).
Чтобы получить ожидаемый результат, вы должны написать вместо этого
std::strcmp( s.c_str(), "" ) == 0
Что касается этих двух выражений
s==""
и
s==s.c_str()
затем сравниваются строки, потому что стандартный класс std :: string имеет перегруженный оператор == для правого операнда.