我尝试在线搜索解决方案,但找不到一个。我来的壁橱是A similar unanswered question on cplusplus.com
这是我的代码......
int main()
{
char a[1000000],s[100000];
scanf("%s",s);
int i,l=strlen(s);
//cout<<l;
for(int i=0;i<l;i++)
a[i]=s[l-i-1]; //to reverse the word in s[]
cout<<a<<endl;
for(i=0;i<l;i++)
{
s[i]+=a[i]-96;
if(s[i]>'z')
{
int diff=s[i]-'z';
s[i]='a'+(diff-1);
}
}
cout<<s;
return 0;
}
//l=length of string.
//a[i]=is another string with word in s[] being reversed.
我的问题是,当我执行此操作并输入一个输入时,比如world
,它会输出一些奇怪的字符。
我无法看到我应用的逻辑有任何错误,我现在感到沮丧。
问的问题是我应该添加两个字符串,其中一个字符串是另一个字符串的反转版本,并且添加操作的方式是'a' + 'b' = 'c'
,'d' + 'a' = 'e'
。 ......和'z' + 'a' = 'a'
。因此,在小字母下关闭了添加。
答案 0 :(得分:1)
您的问题是您正在使用签名字符(已签名字节)。当签名的字符超过127时,它会翻转为负数。这会导致您的计算错过价值超出范围的事实,并且当它被打印时,它会被转换回高字符。
您只需用以下内容替换您的环绕检查:
while ((unsigned char)s[i] > 'z')
{
s[i] -= 26;
}
然后你的程序至少做你想做的事。评论中提出了很好的建议,使其更加健壮。