cpp中的字符串算术

时间:2015-07-07 12:13:40

标签: c++ string algorithm

我为ceasar密码编写代码,但在某些输入中给出了错误的答案。我怀疑加法后的ASCII值是否为负值。请帮忙。

int main() {

    int N,k,i=0;
    string s;
    cin >> N;
    cin >> s;
    cin >> k;

    if(N < 1 || N > 100 || k >100 || k < 0)
        return 0;

    if(k >= 26 )
        k = k%26;

    for(i=0;i<N;i++)
    {
        if(s[i] >= 65 && s[i] <= 90)
        {
            s[i] += k;
            if(s[i] > 90)
                s[i] -= 26;
        }
        if(s[i] >= 97 && s[i] <= 122)
        {
            s[i] += k;
            if(s[i] > 122 )
                s[i] -= 26;
        }
    }

    cout << s;
    return 0;
}

输入:

   10
   www.abc.xy
   87

预期产出:

   fff.jkl.gh

我的输出:

   .jkl.

2 个答案:

答案 0 :(得分:1)

在小写字母的部分

if(s[i] >= 97 && s[i] <= 122)
{
   s[i] += k;
   if(s[i] > 122 )
      s[i] -= 26;
}  

你有溢出问题(可能)。首先转换char 到0到26之间的东西,并在应用凯撒之后,还原它:

if(s[i] >= 'a' && s[i] <= 'z')
{
   s[i] -= 'a';
   s[i] += k;
   s[i] %= 26;
   s[i] += 'a';
}  

类似于大写字母。

除此之外:
您应该使用s.length()而不是让用户决定N是什么 如果k为负,会发生什么?

Btw。,Arithm e tic和C ae s a r。

答案 1 :(得分:-1)

问题仅出在ASCII - CHAR转换

这肯定有用

int N,k,i=0;
string s;
cin >> N;
cin >> s;
cin >> k;
if(N < 1 || N > 100 || k >100 || k < 0)
    return 0;

if(k >= 26 )
{
    k = k%26;
}
for(i=0;i<N;i++)
{
    if(s[i] >= 65 && s[i] <= 90)
    {   int t=(int)s[i];
        t += k;
        if(t > 90)
            t -= 26;
s[i]=(char)t;
    }
    if(s[i] >= 97 && s[i] <= 122)
    {
int t=(int)s[i];
t+=k;
if(t>122)
t-=26;
s[i]=(char)t;
    }
}

cout << s;
return 0;