请考虑以下代码:
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).但我不认为这是正确的.如何摆脱编译错误?
返回类型应该是,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:不要觉得有必要复制/粘贴.使用它作为指针来改进您的编码实践.此外,为了满足批评者:使用上面的示例传递已分配的指向加密例程的指针.
它希望您返回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,因此您的强制转换可能会截断该值.