C语言:输出的最后一个字符后面有一个尾随字符

时间:2015-09-24 04:35:59

标签: c encryption caesar-cipher

我正在为我的实验室工作表制作凯撒的密码,并使其能够加密3个子代(Caesar的密码),这是练习的重点。但有一件事困扰着我。首先,如果我把它放在3以外,就会有一个尾随字符。例如,输入“malware”,键入2。 这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
   char text[100];
   int key,i;

   printf("Please enter a word/sentence (lowercaps) for encrypting :\n ");
   fgets(text,100,stdin);
   printf("Please enter the key that you desire : eg:14\n");
   scanf("%d", &key);
   for(i=0;i<strlen(text);i++)
   {
      if (key>=26)
      {
         key=key%26;
      }
      if (text[i]==' ')
      {
         continue;
      }
      if(text[i]+key>'z')
      {
         text[i]-=97;
         text[i]+=26;
         text[i]+=key;
         text[i]%=26;
         text[i]+=97;
      }
      else
      {
         text[i]=text[i]+key;
      }
   }

   printf("this is your encrypted text : %s", text );
}

我希望我遵循正确的缩进方法进行编码。因此而有很多不喜欢

3 个答案:

答案 0 :(得分:2)

代码是1)没有正确检测char何时是小写字母2)加密来自'\n'的{​​{1}}的非字母,这导致OP的“尾随字符”我输出的字符“。

相反:

fgets()

可选地

if (text[i] >= 'a' && text[i]<= 'z') {
   text[i] = (text[i] - 'a' + key)%26 + `a`;
}
else {
  ; // nothing 
}

注意:以上内容取决于if (islower((unsigned char) text[i]) { text[i] = (text[i] - 'a' + key)%26 + `a`; } 编码为ASCII

不依赖于ASCII的解决方案。

char

答案 1 :(得分:0)

正如Blake_Lead所说,这个&#39; \ 0&#39;字符在您的密码中被更改

确实我对缓冲区的长度是错误的,因为fgets()放了一个&#39; \ 0&#39;
从手册页:

  

终止空字节(&#39; \ 0&#39;)存储在缓冲区中的最后一个字符之后。

所以,你只需要改变你的测试

if (text[i]==' ')

通过以下方式:

 if (text[i] < 'A' || text[i] > 'z' || (text[i] > 'Z' && text[i] < 'a') )

答案 2 :(得分:0)

我将简化并更正此代码

#include <stdio.h>

int main() {
    char text[100];
    int key, i;
    printf("Enter a word / sentence (lowercaps) for encrypting : ");
    fgets(text, 100, stdin);
    printf("Enter the key that you desire (eg. 14) : ");
    scanf("%d", &key);
    key %= 26;    // Pull this out of the loop and remove the unnecessary if
    for (i = 0; text[i]; ++i) {    // Correct the loop condition
        if (text[i] == ' ') continue;
        if (text[i] + key > 'z')
            text[i] = (text[i] - 97 + 26) % 26 + 97;    // Simplify
        else
            text[i] += key;
    }
    printf("Encrypted text : %s\n", text);
    return 0;
}

<强>输入

Enter a word / sentence (lowercaps) for encrypting : malware
Enter the key that you desire (eg. 14) : 2

<强>输出

Encrypted text : ocnyctg