未知字符将添加到字符串的最后一个

时间:2015-06-28 15:39:13

标签: c++ string raw-input

以下是我在C ++中设计的应用程序的一部分。下面的代码片段显示***作为用户输入的密码。代码在程序中的两个位置使用,一个正常工作,另一个位置在ACCESS_SECRET末尾显示未知字符。

此处工作正常。输入的密码保存在文件中以供进一步使用。

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

程序运行的图像。 Image of program run.

我不明白为什么相同的代码(仅使用不同的变量)给出不同的工作如何根据需要更正代码?

3 个答案:

答案 0 :(得分:5)

你必须改变

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

p[i]='\0';

因为i在最后一次循环迭代后已经增加了。

但是,最好不要使用原始字符数组:

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

答案 1 :(得分:4)

考虑x ==&#39; \ r&#39; 。这里没有存储i px [i]的值。您存储&#39; \ 0&#39;第i + 1位的角色。

您应该将其更改为px [i](对于输入\ r的i),给出了正确的字符。

px[i]=='\0'

答案 2 :(得分:2)

为简单起见,我们假设您输入一个单字母密码(无关紧要)。

您输入循环,变量innerHTML等于div。然后循环迭代,并且i增加到0,并且您读取换行符(或者更确切地说是i)并且您跳出循环,1等于到'\r'。然后在i处终止字符串,因此您将终结符设置为1,超出输入字符串的长度。