Неизвестный символ добавляется в последнюю строку

Ниже приведена часть моего приложения, разработанного на 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;}
}

Образ программы запуска.
Образ программы запуска.

Я не понимаю, почему один и тот же код (только с разными переменными) дает работу по-разному. Как я могу исправить код, чтобы он работал правильно, как нужно ?.

0

Решение

Вы должны изменить

p[i+1]='\0';

в

p[i]='\0';

так как i был уже увеличен после последней итерации цикла.

Однако лучше вообще не использовать необработанные символьные массивы:

string pwd;
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
pwd += x;
}
5

Другие решения

Рассмотрим случай, когда x == ‘\ r’. Здесь для этого значения i px [i] не сохраняется. Вы сохраняете символ ‘\ 0’ в i + 1-й позиции.

Вы должны изменить это, так как px [i] (для i, в котором было введено \ r) дает неверный символ.

px[i]=='\0'
4

Для простоты, скажем, вы вводите однобуквенный пароль (неважно, что это).

Вы вводите цикл и переменную i равно 0, Затем цикл повторяется, и i увеличивается до 1и вы читаете новую строку (или, скорее, '\r') и вы выходите из цикла, с i равно 1, Затем вы завершаете строку в i + 1, так что вы установите терминатор на px[2]один за пределами длины введенной строки.

2
По вопросам рекламы [email protected]