我试图写一个非常简单的代码。
基本上,我从用户那里得到一个“加密”字符串,我的代码用以下规则对其进行解密:
“从字符串的第一个字母减去一,从第二个减法2,从第三个减法3,依此类推。空格保持不变“
我写了这段代码:
char* q4(char* str_in)
{
char* str_out;
int str_out_length,i,temp;
str_out_length=strlen(str_in)+1; //+1 for null terminator
str_out=(char*)malloc(sizeof(char)*str_out_length);
str_out[str_out_length]='\0'; //null terminator at last index
for(i=0;i<str_out_length;i++)
{
if(str_in[i]!=' ')
{
temp=str_in[i];
str_out[i]=(char)(temp-i-1);
}
else
str_out[i]=str_in[i];
}
return str_out;
}
我的代码似乎返回了不正确的输出,不仅如此,我还有一个错误,即“检测到堆损坏”。
例如,当字符串i输入为
Btwlzx Dqqes
时,输出为Arthur <hgZg<=
并出现错误。基本上第一个词是正确的。第二个是垃圾。如果我只输入Btwlzx
,则输出为Arthur-
,并显示错误。我做错什么了?
最佳答案
str_out_length=strlen(str_in)+1; //+1 for null terminator
str_out=(char*)malloc(sizeof(char)*str_out_length);
似乎终止符放在分配的缓冲区后面一个字节。试用
str_out[str_out_length - 1]='\0';
同样,也许
for(i=0;i<str_out_length;i++)
应该是
for(i=0;i<str_out_length-1;i++)
或者,也许更好,改变
str_out_length=strlen(str_in)+1; //+1 for null terminator
str_out=(char*)malloc(sizeof(char)*str_out_length);
具有
str_out_length=strlen(str_in);
str_out=(char*)malloc(sizeof(char)*(str_out_length+1)); //+1 for null terminator
然后使用
str_out_length
而不进行-1
校正。更新(阅读评论后)
print_decrypted("Btwlzx Dqqes Eq|pj2 Tjhvqujs Iqoqjy bpg Eqfxtx Xcwwtt");
输出
亚瑟·柯南·道尔、夏洛克·福尔摩斯和沃森医生
void print_decrypted(char* str)
{
int k = 0;
for (int i = 0; str[i] != '\0'; i++)
if (str[i] != ' ')
{
printf("%c", str[i] - k - 1);
k++;
}
else
{
printf(" ");
k = 0;
}
printf("\n");
}