未知字符被添加到字符串的最后
Unknown character is being added to the last of the string
下面是我用 C++ 设计的应用程序的一部分。下面的代码片段显示 *** 作为密码输入 user.The 代码在程序的两个地方使用,一个工作正常,另一个地方它在 enterdPassword
末尾显示未知字符。
工作正常here.the输入的密码保存在文件中以供进一步使用。
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]='[=10=]';
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] = '[=11=]';
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;}
}
程序图像运行。
我不明白为什么相同的代码(仅使用不同的变量)会产生不同的效果如何更正代码以使其按预期正确工作?
考虑 x == '\r' 的情况。这里没有存储 i px[i] 的值。您将 '\0' 字符存储在第 i+1 个位置。
您应该将其更改为 px[i](对于输入 \r 的 i)给出了不正确的字符。
px[i]=='[=10=]'
你必须改变
p[i+1]='[=10=]';
到
p[i]='[=11=]';
因为i
在最后一次循环迭代后已经递增了。
但是,最好不要使用原始字符数组:
string pwd;
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
pwd += x;
}
为简单起见,假设您输入一个单字母密码(不管它是什么)。
你进入循环,变量i
等于0
。然后循环迭代,并且 i
增加到 1
,然后您读取换行符(或者更确切地说是 '\r'
)并跳出循环,其中 i
等于至 1
。然后在 i + 1
处终止字符串,因此将终止符设置在 px[2]
,超出输入字符串的长度。
下面是我用 C++ 设计的应用程序的一部分。下面的代码片段显示 *** 作为密码输入 user.The 代码在程序的两个地方使用,一个工作正常,另一个地方它在 enterdPassword
末尾显示未知字符。
工作正常here.the输入的密码保存在文件中以供进一步使用。
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]='[=10=]';
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] = '[=11=]';
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;}
}
程序图像运行。
我不明白为什么相同的代码(仅使用不同的变量)会产生不同的效果如何更正代码以使其按预期正确工作?
考虑 x == '\r' 的情况。这里没有存储 i px[i] 的值。您将 '\0' 字符存储在第 i+1 个位置。
您应该将其更改为 px[i](对于输入 \r 的 i)给出了不正确的字符。
px[i]=='[=10=]'
你必须改变
p[i+1]='[=10=]';
到
p[i]='[=11=]';
因为i
在最后一次循环迭代后已经递增了。
但是,最好不要使用原始字符数组:
string pwd;
for(i=0; i<13; i++){
x = getch();
if(x == '\r'){ break; }
pwd += x;
}
为简单起见,假设您输入一个单字母密码(不管它是什么)。
你进入循环,变量i
等于0
。然后循环迭代,并且 i
增加到 1
,然后您读取换行符(或者更确切地说是 '\r'
)并跳出循环,其中 i
等于至 1
。然后在 i + 1
处终止字符串,因此将终止符设置在 px[2]
,超出输入字符串的长度。