Ниже приведена часть моего приложения, разработанного на C ++. Приведенный ниже фрагмент кода отображает *** как пароль, введенный пользователем. Код используется в двух местах в программе, одна работает нормально, а другая — в конце неизвестного символа. enterdPassword
,
Здесь все работает нормально. Введенный пароль сохраняется в файле для дальнейшего использования.
if(FirstRun()){
display_welcome_text_first_run();
cout<<"\nEnter A Password(Max 13 character): ";
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
putchar('*');
p[i]=x;
}
p[i+1]='\0';
string pwd(p);
ofstream o(PASSWORD_FILE,ios::binary);
o <<pwd<<endl;
o.close();
Здесь он показывает ошибку, он показывает неизвестный символ в конце enterdPassword
,
bool verifyPassword(){
string savdPassword;
char px[20], x;
int i;
cout<<"Enter Your Password To Continue: ";
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
putchar('*');
px[i] = x;
}
px[i+1] = '\0';
string enterdPassword(px);
ifstream pp(PASSWORD_FILE, ios::binary);
pp>>savdPassword;
pp.close();
cout<<endl<<enterdPassword;<<" "<<savdPassword; //for debugging
if(enterdPassword == savdPassword){
return true;
}
else{return false;}
}
Образ программы запуска.
Я не понимаю, почему один и тот же код (только с разными переменными) дает работу по-разному. Как я могу исправить код, чтобы он работал правильно, как нужно ?.
Вы должны изменить
p[i+1]='\0';
в
p[i]='\0';
так как i
был уже увеличен после последней итерации цикла.
Однако лучше вообще не использовать необработанные символьные массивы:
string pwd;
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
pwd += x;
}
Рассмотрим случай, когда x == ‘\ r’. Здесь для этого значения i px [i] не сохраняется. Вы сохраняете символ ‘\ 0’ в i + 1-й позиции.
Вы должны изменить это, так как px [i] (для i, в котором было введено \ r) дает неверный символ.
px[i]=='\0'
Для простоты, скажем, вы вводите однобуквенный пароль (неважно, что это).
Вы вводите цикл и переменную i
равно 0
, Затем цикл повторяется, и i
увеличивается до 1
и вы читаете новую строку (или, скорее, '\r'
) и вы выходите из цикла, с i
равно 1
, Затем вы завершаете строку в i + 1
, так что вы установите терминатор на px[2]
один за пределами длины введенной строки.