Вы заявили, что strcmp()
означает, что две строки равны, когда вы знаете, что они не ...
Проблемы с \n
, упомянутые в других ответах, неЕсли вы действительно видите, как strcmp()
возвращает неправильное указание, возникает вопрос, почему?
В C string
определяется как символьный массив с символом null
.Поэтому, если, например, если у вас есть следующее:
char password[MAXPASSWORD] = {0};//where MAXPASSWORD == 12
|p|a|s|s|1|2|3|\0|\0|\0|\0|\0| // `PASSWORD ` - legal string
|s|o|m|e|p|a|s|s|1|2|3|4|\n| // 'password'
даже после замены символа \n
, этот массив слишком длинный на один символ:
|s|o|m|e|p|a|s|s|1|2|3|4|\0| // 'password' - too long by 1 character
^ // end of legal definition of `password`
Если password
массив содержит слишком много символов, даже в этом случае после замены последнего char
\n
на NULL в расположении за пределами допустимого определения строки код становится предметом неопределенное поведение .
Строковые функции предназначены для работы исключительно с strings
.Когда представлен ненулевой символьный массив, в данном случае strcmp()
, поскольку он ищет терминатор nul
, чтобы узнать, где находится конец строки, нельзя ожидать, что он будет вести себя с предсказуемостью.(В этом случае расположение символа nul
может стать причиной неопределенного поведения.)
Чтобы этого не произошло, даже если пользователь смог ввести слишком много символов в password
, всегдазавершается с помощью следующего выражения:
password[MAXPASSWORD-1] = 0; //for a properly initialized array, (as your code indicates)
//this guarantees termination occurs
//within legal memory area of defined variable.
При этом не будет неопределенного поведения, и если строки различаются, strcmp()
будет указывать на это.