oj错误之char型超出范围

在oj时遇到一个题

题目本身并不是很难,但在一个数据时出了错,刚开始一直没想通是哪里出了错

下面为源代码

#include <bits/stdc++.h>
using namespace std;
int n;
char s[50];
int main()
{
    scanf("%d",&n);
    scanf("%s",s);
    
    for(int i=0;s[i]!='\0';i++)
    {    
        s[i]+=(n%26);
        if(s[i]>'z')    s[i]-=26;
    }
    printf("%s",s);
    return 0;    
}

在输入为如下时,无法通过:

25

xyz

后面去查了ascii表发现,小写字母已经非常接近的末尾了

x+25后已经超出char型的127范围,根据汇编这里应该已经是一个负值了,再减去26也无济于事,所以导致产生错误

随后选择直接在‘a’的基础上计算位移,避免直接在char型上进行加减,成功AC

#include <bits/stdc++.h>
using namespace std;
int n;
char s[50];
int main()
{
    scanf("%d",&n);
    scanf("%s",s);
    
    int ans;
    for(int i=0;s[i]!='\0';i++)
    {    
        ans=(s[i]-'a'+n)%26;
        s[i]=ans+'a';
    }
    printf("%s",s);
    return 0;    
}

猜你喜欢

转载自www.cnblogs.com/wcxcc/p/10396510.html
今日推荐