c语言中的大小字母转换及字母升序的问题

问题有以下要求:

1如果是字母,转换成字母序列的下三个字母,如A译成D、B译成E。
2如果是字母Z,译成C。
3无论是大小写字母,都译成小写字母。
4其他字符一律照原样译出。
5以@表示结束。

#include <stdio.h>

void main()
{
char str1[120], str2[120];
int i = 0;
printf("Please input a string:\n");
scanf("%s", str1);
while (str1[i] != '\0')
{
if (str1[i] == 'Z')
str2[i] = 'C';
else if (str1[i]>='A'&&str1[i]<='W')
str2[i] = str1[i] + 35;
else if(str1[i]=='X')
str2[i]=str1[i]+9;
else if(str1[i]=='Y')
str2[i]=str1[i]+9;
else if ( str1[i]>='a'&&str1[i]<='w')
str2[1]=str1[i]+3;
else if (str1[i]>='x'&&str1[i]<='y')
str2[i]=str1[i]-23;
i++;
if (str1[i] == '@') break;
}
printf("\n Source string: %s \n Target string: %s\n", str1, str2);
}

Source string: sdasdasiihhzaqkkmHHIIYYZADGH753269552

Target string: 蘰烫蘫kllbbCdgjk烫sdasdasiihhzaqkkmHHIIYYZADGH753269552

我的解答思路和尝试过的方法
怎么让程序正确

四个问题。1.对‘@’的判断,因该放在i++之前,不然0位置判断不到。2.第四个elseif里面下标写错了,写成1了应该是i。3.对其他字符你没有处理,填上即可。4.处理完后应该给str2末尾填上‘\0’,当然也可以开始时就初始化好。


#include<stdio.h>
#include<stdlib.h>


int main()
{
    char str1[120], str2[120];
    int i = 0;
    printf("Please input a string:\n");
    scanf("%s", str1);
    while (str1[i] != '\0')
    {
        if (str1[i] == '@') break;


        if (str1[i] == 'Z')
            str2[i] = 'C';
        else if (str1[i] >= 'A' && str1[i] <= 'W')
            str2[i] = str1[i] + 35;
        else if (str1[i] == 'X')
            str2[i] = str1[i] + 9;
        else if (str1[i] == 'Y')
            str2[i] = str1[i] + 9;
        else if (str1[i] >= 'a' && str1[i] <= 'w')
            str2[i] = str1[i] + 3;
        else if (str1[i] >= 'x' && str1[i] <= 'y')
            str2[i] = str1[i] - 23;
        else 
            str2[i] = str1[i];

        i++;
    }
    str2[i] = '\0';
    printf("\n Source string: %s \n Target string: %s\n", str1, str2);
    return 0;
}

其他字符原样输出
所以你要么直接在str1里修改数据
要么必须要有个else,把str1里的数据原封不动的赋值给str2
否则有些数据没赋值,是个随机数,不成乱码了吗

使用一个数组内修改

#include <stdio.h>

int main(void)
{
    int i=0;
    char str[120];
    printf("请输入一个字符串:\n");
    scanf("%s",str);
    while(str[i]!='\0')
    {
        if(str[i]>='A'&&str[i]<='Z')/*取出A-Z,转换为小写a-z*/
            {str[i]=str[i] + 32;
            if(str[i]>='a'&&str[i]<='w')/*取出小写a-z,进行+3操作*/
                str[i]=str[i]+3;
            else if(str[i]>='x'&&str[i]<='z')
                str[i]=str[i]-23;}
        else if(str[i]=='@')/*判断是否为@,是则退出循环*/
            {str[i+1]='\0';
            break;}
        else if(str[i]>='a'&&str[i]<='w')/*取出小写a-z,进行+3操作*/
            str[i]=str[i]+3;
        else if(str[i]>='x'&&str[i]<='z')
            str[i]=str[i]-23;
        i=i+1;
    }
    printf("%s",str);
    return 0;
}