Вы не можете сравнивать it
с NULL
. Вместо этого вы должны сравнивать *it
с '\0'
. Или еще лучше, используйте std::string
и никогда не беспокойтесь об этом :-)
Таким образом, при переборе строки в стиле C. Вы должны зацикливаться до тех пор, пока символ, который вы видите, не станет '\0'
. Сам итератор никогда не будет NULL
, так как он просто указывает место в строке. Тот факт, что итератор имеет тип, который можно сравнить с NULL
, является деталью реализации, которую не следует трогать напрямую.
Кроме того, вы пытаетесь записать строковый литерал. А вот нет-нет :-).
EDIT: как отметили @Cheers и hth. - Альф, tolower
может сломаться, если заданы отрицательные значения. К сожалению, нам нужно добавить приведение, чтобы убедиться, что это не сломается, если вы подадите ему данные в кодировке Latin-1 или что-то подобное.
Это должно работать:
char word[] = "HeLlo";
for (auto it = word; *it != '\0'; ++it) {
*it = tolower(static_cast<unsigned char>(*it));
}
person
Evan Teran
schedule
23.11.2015
new
это C++, а не C. - person Barmar   schedule 24.11.2015word = new char[20];
наword = "HeLlo";
? Если это так, вы не сможетеdelete word
позже. - person Weather Vane   schedule 24.11.2015char* it
, все равно получаю ошибку времени выполнения. @Погода да. - person mask   schedule 24.11.2015word = "Hello";
назначает указатель и не копирует содержимое. Вместо этого используйтеstd::string
. - person Thomas Matthews   schedule 24.11.2015string
, вам нужно понимать семантику указателей. - person curiousguy   schedule 24.11.2015