解码消息使用c

e4eetjau  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(101)

我在用C解决一个叫做“解码信息”的密码战问题。
我的代码通过了示例测试,但无法通过随机测试,因为它在所需字符后添加了随机字符,如图像enter image description here所示
有什么问题吗?
问题链接:[网址:

#include <string.h>
#include <ctype.h>

char *decode (const char *encoded, char *decoded)
{
  for (int i = 0; i < strlen(encoded); i++)
  {
    if (isalpha(encoded[i]))
    {
      if (encoded[i] <= 109)
      {
          decoded[i] = encoded[i] + 25 - ((encoded[i] - 'a')*2);  
      }
      else if (encoded[i] >= 110)
      {
          decoded[i] = encoded[i] - 25 + (('z' - encoded[i])*2);
      } 
    }
    else
    {
      decoded[i] = encoded[i];
    }
  }
    return decoded; // return it
}
xu3bshqb

xu3bshqb1#

如注解中所示,OP * 描述的症状表明 * 接收缓冲区未正确终止以生成C字符串。
此外,应该避免在代码中使用“幻数”,如109和110......这些数字是什么意思?如果取消“全部小写”的限制,它们肯定不会起作用。那么,是否应该复制/粘贴/修改许多行代码,仅仅是为了处理大小写字母?
以下是LESS代码,它不仅处理OP问题(未终止字符串),而且处理大小写字母(认识到“case”会削弱任何加密。此处仅用于演示技术)。
祝你在这些学习挑战中玩得开心。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *decode( const char *s, char *d ) {
    for( size_t i = 0; ( d[i] = s[i] ) != '\0'; i++ ) { // copy every byte
        if( isalpha( d[i] ) ) { // transform needed ?
            char c = islower( d[i] ) ? 'a' : 'A'; // basis to transpose ASCII char to 0-25
            d[i] = (char)( c + ( 25 - ( d[i] - c ) ) ); // 0->25 ==> 25->0
        }
    }
    return d; // return it
}

int main() {
    char *hidden = "R slkv MLYLWB wvxlwvh gsrh nvhhztv";
    char buf[ 128 ];

    printf( "%s\n%s\n", hidden, decode( hidden, buf ) );
    return 0;
}
R slkv MLYLWB wvxlwvh gsrh nvhhztv
I hope NOBODY decodes this message

如果有任何不清楚的地方,请在下面提出问题...

相关问题