我基本上编写了一个简单的Caesar密码程序(只需用硬编码密钥12移动ASCII中的字符)但我是C的新手,因此无法使用指针并接受char数组作为输入并将它们作为输出返回。
这是我到目前为止所得到的。你能帮我弄清楚出了什么问题吗?
提前致谢。
#include<string.h>
#include<stdio.h>
int main() {
char hello[50][50] = {{'h','e','l','l','o'}, {'h','r','u','\0'}};
hello = encrypt(hello);
printf("%s", hello[50][50]);
}
char** encrypt(char text[50][50]) {
int i,j;
for(i=0; i<50; i++) {
for(j=0; j<50; j++) {
if (text[i][j]!='\0') {
text[i][j] = (char)((int)text[i][j]+12)%256;
} else {
break;
}
}
}
return text[50][50];
}
char** decrypt(char text[50][50]) {
int i,j;
for(i=0; i<50; i++) {
for(j=0; j<50; j++) {
if (text[i]!='\0') {
text[i][j] = (char)((int)text[i][j]-12)%256;
} else {
break;
}
}
}
return text[50][50];
}
答案 0 :(得分:1)
您的主要问题似乎是了解hello[50][50]
的含义
在char hello[50][50]
中,它分配50组50个字符块。
但是它自己的hello[50][50]
指的是单个字符,在第51个b锁定中的第51个位置 - 因为C计数形式为0,你的块是数字[0]到[49]所以[50]无效。 / p>
将2维数组传递给C并不是你想象的那样。
我建议使用1维数组作为长字符串,单词简单地用空格分隔 - 这将更清晰,更容易理解。
如果您将1d数组分配为
char hello[50];
您可以将其传递给func(char hello[])
或func(char *hello)
的函数,并仍在函数内使用hello [i]表示法
答案 1 :(得分:0)
执行密码的代码在某些情况下会出现一些问题。你将12添加到角色的值,然后执行一个模256.如果你传递了一个更高价值的字母,它将不会做你想要的。
示例:
('A'+ 12)%256 =&gt; (65 + 12)%256 = 77 =&gt; 'M'//按预期工作
('X'+ 12)%256 =&gt; (88 + 12)%255 = 100 =&gt; 'd'//应该是'J'
解决方案是修改函数以确保它正确包装。由于您的示例仅使用小写字母,因此我将仅涵盖该案例。
text[i][j] = (((text[i][j] - 'a') + 12) % 26) + 'a';