小心溢出!

P1914 小书童——凯撒密码

pomoke @ 2017-08-15 13:30:50

#include <stdio.h>
#include <string.h>
#pragma message("Hello!")
int main(void)
{
  long int n;
  char passwd[105],*ptr;
  scanf("%ld %s",&n,passwd);
  n%=26;
  //To passwd,Z:123
  ptr=passwd;
  while(*ptr!='\0')
  {
    *ptr=*ptr-96+n;
    if (*ptr>26) *ptr-=26;
    *ptr+=96;
    ptr++;
  }
  printf("%s\n",passwd);
  return 0;
}

by sochiji @ 2017-08-16 01:11:10

'z'的ASCII是122,标准ASCII的上限是127。

如果尝试计算'z'后面超过5号的字符就会产生错误。

必须先判断越界情况。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    long t;
    string s;
    cin >> t;
    t %= 26;    //这一行是不是有点多余
    cin.get();    //换行读取
    cin >> s;
    for (unsigned long i = 0; i <= s.length()-1; i++)    //对s的每一位操作
    {
        if ('z' - s[i] >= t)    //判断
            s[i] += t;
        else
            s[i] += t - 26;    //把s[i]控制在小写字母的区域内
    }
    cout << s;
}

以上代码C++11,全部测试点满分。


by kissinger @ 2017-08-24 13:14:41

unsigned char就不会溢出了


by ybwowen @ 2017-08-26 09:46:29

你碰到z+1变为a会死啊?


by awask @ 2017-09-13 20:28:57

aaaaaaaaaaaaaaaaaaaa


|