C++错误 - 返回一个char数组

Yos*_*osi 3 c c++

请考虑以下代码:

char CeaserCrypt(char str[256],int key)
{
    char encrypted[256],encryptedChar;
    int currentAsci;

    encrypted[0] = '\0'; 

    for(int i = 0; i < strlen(str); i++) 
    {
        currentAsci = (int)str[i];
        encryptedChar = (char)(currentAsci+key);
        encrypted[i] = encryptedChar;
    }

    return encrypted;
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2010出错,因为该函数返回一个数组.我该怎么办?

我的朋友告诉我要将签名更改为void CeaserCrypt(char str[256], char encrypted[256], int key).但我不认为这是正确的.如何摆脱编译错误?

Lin*_*een 7

返回类型应该是,char *但这只会增加另一个问题.

encryptedCeaserCrypt在函数返回时被"分配"在堆栈上并且可能无效.由于encrypted与输入的长度相同,请执行以下操作:

int len = strlen(str);
char *encrypted = (char *) malloc(len+1);

encrypted[len] = '\0';

for (int i = 0; i < len; i++) {
// ...
}
Run Code Online (Sandbox Code Playgroud)

不要忘记稍后释放缓冲区(尽管free()).

编辑: @Yosy:不要觉得有必要复制/粘贴.使用它作为指针来改进您的编码实践.此外,为了满足批评者:使用上面的示例传递已分配的指向加密例程的指针.

  • 分配一个必须由调用者释放的缓冲区是一种不好的做法.它可能会导致内存泄漏(因为没有人是完美的). (5认同)

luk*_*uke 6

它希望您返回char*而不是char.无论如何,您不应该返回引用或指向您在堆栈上创建的内容的指针.在堆栈上分配的东西具有与其范围相对应的寿命.范围结束后,允许那些堆栈变量消失.

返回std :: vector而不是数组.

std::vector<char> CeaserCrypt(char str[256],int key)
{
    std::vector<char> encrypted(256);
    char encryptedChar;
    int currentAsci;

    encrypted[0] = '\0'; 

    for(int i = 0; i < strlen(str); ++i) 
    {
        currentAsci = (int)str[i];
        encryptedChar = (char)(currentAsci+key);
        encrypted[i] = encryptedChar;
    }

    return encrypted;
}
Run Code Online (Sandbox Code Playgroud)

但是还有另一个微妙的问题:你将一个整数转换为字符值.int的最大大小远大于char,因此您的强制转换可能会截断该值.

  • @Andrey:在std :: vector中? (4认同)