难以忍受如何返回颠倒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循环的过程,但它抛出时,结果被发送到另一个功能说密码验证一个破发点消息。该功能至少允许程序运行而不出错。我遇到的问题是合乎逻辑的,但我看不到它。

+2

'char * rev_pass = new char [last_let];'您需要为'\ 0'分配空间在返回之前,请确保将它放在'rev_pass'的末尾。 – drescherjm

+0

只需使用'std :: string'和'std :: reverse()'。转储c风格的字符串。 –

这里有几个问题。首先是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; 
} 
+0

我想说p_word [rev_index]的检查有点棘手,因为你正在测试一个你没有在循环中使用的值(pword使用last_let作为索引), while(p_word [rev_index] !='\ 0') { rev_pass [ - last_let] = p_word [rev_index ++]; } –

+0

@StefanoBuora这是“棘手”,但我没有看到它可能会失败的一种方式。我想'while(last_let> 0)'也可以工作 – NathanOliver

+0

它的工作,毫无疑问。我认为“while(last_let> 0)”或者可以帮助保持代码更一致。 –

我想在这里说的三件事:

  1. new char[last_let];应该是new char[last_let+1];,不包括在strlen用于/ 0空间返回值
  2. rev_pass[0] = '\0';应是`rev_pass [last_let] ='\ 0';你希望字符串是0 终止
  3. 结束循环条件是p_word[last_let] != '\0,但你减少last_let ......,这样你检查0字节前的开始,是不是该字符串的值无论如何保证。字符串0终止!

对于(3)我想,如果你翻转的循环索引使用(例如last_let为源反转串并rev_index应使的伎俩)

快乐编码,科技教育