难倒在如何返回反向cstring

时间:2017-06-12 19:14:32

标签: c++ c-strings

首先,我是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循环,但是当结果被发送到另一个函数以验证所述密码时,它会抛出一个断点消息。此函数至少允许程序无错误地运行。我遇到的问题是合乎逻辑的,但我看不到它。

2 个答案:

答案 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)

我会在这里说三件事:

  1. new char[last_let];应为new char[last_let+1];,/ {0}空格不包含在strlen返回值中
  2. rev_pass[0] = '\0';应为`rev_pass [last_let] =&#39; \ 0&#39 ;;您希望字符串为0 已终止
  3. 结束循环条件是p_word[last_let] != '\0,但是你正在减少last_let的值...所以你要检查之前的<0>字节字符串的开头是不保证的以任何方式。字符串是0终止!
  4. 对于(3)我认为如果你在循环中翻转索引用法(例如,反向字符串的last_let和源的rev_index应该成功)

    快乐编码,Ste