首先,我是cstrings的新手,我必须将它们用于作业。我希望我没有,因为他们很痛苦。
无论如何,我遇到的问题是使用接受密码的功能,撤消订单并将其传递回main。无论出于何种原因,我都无法填充持有密码的cstring。我尝试了不止一种方法让它运转起来,但我没有运气。
功能:
char* Reverse_Pass(char p_word[])
{
int last_let = strlen(p_word);
int rev_index = 0;
char* rev_pass = new char[last_let];
//cout << "\ntest 3";
rev_pass[0] = '\0';
//for (int i = last_let; i >= 0; i--)
while (p_word[last_let] != '\0')
{
rev_pass[rev_index] = p_word[last_let];
rev_index++;
last_let--;
}
return rev_pass;
}
我尝试在进程中使用for循环,但是当结果被发送到另一个函数以验证所述密码时,它会抛出一个断点消息。此函数至少允许程序无错误地运行。我遇到的问题是合乎逻辑的,但我看不到它。
答案 0 :(得分:3)
这里有一些问题。首先,strlen
返回不计算null终止符的字符串长度。这意味着什么时候
while (p_word[last_let] != '\0')
p_word[last_let]
是'\0'
,因为cstrign[strlen(cstring)]
是空终止符,循环永远不会执行。所有这一切虽然仍然是错误的。您真正想要做的是在last_let
小于0
时停止。
这也会影响rev_pass
。你用
char* rev_pass = new char[last_let];
这为字符串提供了足够的存储空间,但对于所有cstrings必须具有的null终止符不够。你需要的是
char* rev_pass = new char[last_let + 1];
最后,您永远不会终止rev_pass
。既然你知道它将是最后一个需要null终止符的位置,你可以简单地使用
rev_pass[last_let] = '\0';
分配后。
所有这些变化都会为您提供
char* Reverse_Pass(char p_word[])
{
int last_let = strlen(p_word);
int rev_index = 0;
char* rev_pass = new char[last_let + 1];
rev_pass[last_let] = '\0';
while (last_let > 0)
{
rev_pass[rev_index++] = p_word[--last_let];
}
return rev_pass;
}
答案 1 :(得分:0)
我会在这里说三件事:
new char[last_let];
应为new char[last_let+1];
,/ {0}空格不包含在strlen
返回值中rev_pass[0] = '\0';
应为`rev_pass [last_let] =&#39; \ 0&#39 ;;您希望字符串为0 已终止 p_word[last_let] != '\0
,但是你正在减少last_let的值...所以你要检查之前的<0>字节字符串的开头是不保证的以任何方式。字符串是0终止!对于(3)我认为如果你在循环中翻转索引用法(例如,反向字符串的last_let和源的rev_index应该成功)
快乐编码,Ste