在 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=]';