难以忍受如何返回颠倒cstring
首先,我是新来的cstrings,我必须使用它们的任务。我希望我不必因为他们是痛苦的。难以忍受如何返回颠倒cstring
无论如何,我遇到的问题是一个函数接受密码,颠倒顺序,并将其传递回主。无论出于何种原因,我都无法让它填充负责保存密码的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循环的过程,但它抛出时,结果被发送到另一个功能说密码验证一个破发点消息。该功能至少允许程序运行而不出错。我遇到的问题是合乎逻辑的,但我看不到它。
这里有几个问题。首先是strlen
返回不包括空终止符的字符串的长度。这意味着,当你做
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必须具有的空终止符。你需要的是
char* rev_pass = new char[last_let + 1];
最后,你永远不会终止rev_pass
。既然你知道这将是最后一个需要空终止符的位置,你可以简单地使用
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;
}
我想说p_word [rev_index]的检查有点棘手,因为你正在测试一个你没有在循环中使用的值(pword使用last_let作为索引), while(p_word [rev_index] !='\ 0') { rev_pass [ - last_let] = p_word [rev_index ++]; } –
@StefanoBuora这是“棘手”,但我没有看到它可能会失败的一种方式。我想'while(last_let> 0)'也可以工作 – NathanOliver
它的工作,毫无疑问。我认为“while(last_let> 0)”或者可以帮助保持代码更一致。 –
我想在这里说的三件事:
-
new char[last_let];
应该是new char[last_let+1];
,不包括在strlen
用于/ 0空间返回值 -
rev_pass[0] = '\0';
应是`rev_pass [last_let] ='\ 0';你希望字符串是0 终止 - 结束循环条件是
p_word[last_let] != '\0
,但你减少last_let ......,这样你检查0字节前的开始,是不是该字符串的值无论如何保证。字符串0终止!
对于(3)我想,如果你翻转的循环索引使用(例如last_let为源反转串并rev_index应使的伎俩)
快乐编码,科技教育
'char * rev_pass = new char [last_let];'您需要为'\ 0'分配空间在返回之前,请确保将它放在'rev_pass'的末尾。 – drescherjm
只需使用'std :: string'和'std :: reverse()'。转储c风格的字符串。 –