在 C 中将 int arr 转换为字符串时随机出现奇怪的字符(具有有效的 ASCII)
Weird characters randomly appearing when converting int arr to string in C (with valid ASCII)
这是用 C 语言实现的简单凯撒密码。
我拿一个 pin,用它做一个钥匙,拿一条消息,将 ASCII 值 w.r.t 移到钥匙上,然后以十六进制输出每个字符的十六进制值。
在使用(在我看来)任何键时,一些(不是全部)消息会导致在解码时打印额外的字符。
- 案例:
出现奇怪的字符:
消息:“hexa !
”
引脚:454545
& 密钥:23
密文:(十六进制)“51 4e 61 4a 9 a fffffff3 4e -6f
”(-6f 仅用于终止输入)
解码时给出的文本:
hexa !
e
其他键生成其他奇怪的字符,例如“+
”。奇怪的字符总是出现在下一行。
整个代码大约有 100 行,所以我不会在这里粘贴它,但是它可用 on GitHub。
不要在这个 repo 中使用 windows .exe,它是旧版本,我试图在发布这个版本之前解决这个问题。
可能出现问题的代码是 encrypt() 和 decrypt() 函数:
void encrypt() {
char msg[3001], ch;
int i,key, en[3001], count = 0;
printf("\n");
key = pin();
getchar();
printf("\nType Message - \n\n");
fgets(msg,sizeof(msg),stdin);
for (i=0; msg[i] != '[=11=]'; i++) {
ch=msg[i];
int d = (ch - key);
en[i] = d;
count++;
}
printf("\nEncrypted message -\n\n");
for (i=0; i <= count; i++)
printf("%x ", en[i]);
printf("-6f");
}
void decrypt() {
char msg[3001], ch;
int i,key, en[3001],d;
printf("\n");
key = pin();
printf("\nEnter encrypted message -\n\n");
getchar();
for (i=0; i <= 3001; i++) {
scanf("%x",&d);
if (d == -111) {
msg[i] = '[=11=]';
break;
} else {
ch = d + key;
msg[i] = ch;
}
}
printf("\nDecrypted message -\n\n");
puts(msg);
}
在你的第二个 for
循环中:
for(i = 0; i <= count; i++)
您 运行 离开了数组的末尾(数组索引从零开始,而不是一)。
改为:
for(i = 0; i < count; i++)
始终将变量声明各占一行。
int a, b, c = 0; // only one variable is initialized.
char *src = 0, c = 0; // c is of type char, not char*
fgets
包括结尾的换行符。不想要就得脱。
int len = strlen(msg);
if(len > 0 && msg[len - 1] == '\n')
msg[len - 1] = '[=13=]';
这是用 C 语言实现的简单凯撒密码。
我拿一个 pin,用它做一个钥匙,拿一条消息,将 ASCII 值 w.r.t 移到钥匙上,然后以十六进制输出每个字符的十六进制值。
在使用(在我看来)任何键时,一些(不是全部)消息会导致在解码时打印额外的字符。
- 案例:
出现奇怪的字符:
消息:“hexa !
”
引脚:454545
& 密钥:23
密文:(十六进制)“51 4e 61 4a 9 a fffffff3 4e -6f
”(-6f 仅用于终止输入)
解码时给出的文本:
hexa !
e
其他键生成其他奇怪的字符,例如“+
”。奇怪的字符总是出现在下一行。
整个代码大约有 100 行,所以我不会在这里粘贴它,但是它可用 on GitHub。 不要在这个 repo 中使用 windows .exe,它是旧版本,我试图在发布这个版本之前解决这个问题。
可能出现问题的代码是 encrypt() 和 decrypt() 函数:
void encrypt() {
char msg[3001], ch;
int i,key, en[3001], count = 0;
printf("\n");
key = pin();
getchar();
printf("\nType Message - \n\n");
fgets(msg,sizeof(msg),stdin);
for (i=0; msg[i] != '[=11=]'; i++) {
ch=msg[i];
int d = (ch - key);
en[i] = d;
count++;
}
printf("\nEncrypted message -\n\n");
for (i=0; i <= count; i++)
printf("%x ", en[i]);
printf("-6f");
}
void decrypt() {
char msg[3001], ch;
int i,key, en[3001],d;
printf("\n");
key = pin();
printf("\nEnter encrypted message -\n\n");
getchar();
for (i=0; i <= 3001; i++) {
scanf("%x",&d);
if (d == -111) {
msg[i] = '[=11=]';
break;
} else {
ch = d + key;
msg[i] = ch;
}
}
printf("\nDecrypted message -\n\n");
puts(msg);
}
在你的第二个 for
循环中:
for(i = 0; i <= count; i++)
您 运行 离开了数组的末尾(数组索引从零开始,而不是一)。
改为:
for(i = 0; i < count; i++)
始终将变量声明各占一行。
int a, b, c = 0; // only one variable is initialized.
char *src = 0, c = 0; // c is of type char, not char*
fgets
包括结尾的换行符。不想要就得脱。
int len = strlen(msg);
if(len > 0 && msg[len - 1] == '\n')
msg[len - 1] = '[=13=]';