c语言 字符串移动n位

输入文字列和大于等于-100小于等于100的数字n,输出把原字符串按字母表移动n次的字符串。
输入的n不是数字时,输出 not number;
输出的n小于-100时 输出 -101 or less;
输出的n大于100时,输出 101 or more;
(文字列内除字母外的其他数字、字符不变,大写字母小写字母不互换,z右移一位为a)

分开好像都会写但是合起来就一直在error,求问应该怎么写。谢谢

我的思路是:
1、先获取原字符串到字符数组
2、获取要移动的位数n,然后对n进行判断三个判断,如果不符合要求就退出
3、循环遍历愿字符串所有字符,然后分大写字母和小写字母两种情况进行位置移动操作。
代码如下:

#include <stdio.h>

int main(void){
    
    char str[200]={'\0'};
    int n;
    printf("请输入一个字符串:\n");
    gets(str);
    printf("请输入字母要移动的位数:\n");
    int r = scanf("%d",&n);
    
    if(r!=1){
        printf("not number");
        return 0;
    }
    
    if(n<-100){
        printf("-101 or less");
        return 0;
    }
    
    if(n>100){
        printf("101 ir more");
        return 0;
    }
    
    int i=0;
    while(str[i]!='\0'){
        
        if(str[i]>='A'&&str[i]<='Z'){  //如果是大写字母 
            
        //    printf("str[%d]=%c,n%26=%d,(str[i]+ (n%26))=%c,((str[i]+ (n%26)) % 26)=%d,((str[i]+ (n%26)) % 26)+'A'=%c\n "
        //    ,i,str[i],n%26,(str[i]+ (n%26)),((str[i]+ (n%26)) % 26) , ((str[i]+ (n%26)) % 26)+'A');
        
        
            //n%26 对n求26的余,求出需要移动多少次有效位
            // (str[i]+ (n%26))  表示移动这个有效位后是哪个字符
            // ((str[i]+ (n%26)) -'A') 表示这个移动后的字符距离字符'A'相隔多少个字符
            // ((str[i]+ (n%26)) -'A') %26 把这个相隔的字符数对26求余表示最终这个移动后的位置距离字符'A'有多远
            // ((str[i]+ (n%26)) -'A') %26 + 'A' 相隔字符'A'的距离加上字符'A'就是最终移动后的位置 
            str[i] = ((str[i]+ (n%26)) -'A') %26 + 'A';
        }
        
        if(str[i]>='a'&&str[i]<='z'){ //如果是小写字母 
            //n%26 对n求26的余,求出需要移动多少次有效位
            // (str[i]+ (n%26))  表示移动这个有效位后是哪个字符
            // ((str[i]+ (n%26)) -'a') 表示这个移动后的字符距离字符'a'相隔多少个字符
            // ((str[i]+ (n%26)) -'a') %26 把这个相隔的字符数对26求余表示最终这个移动后的位置距离字符'a'有多远
            // ((str[i]+ (n%26)) -'a') %26 + 'a' 相隔字符'a'的距离加上字符'a'就是最终移动后的位置 
            str[i] = ((str[i]+ (n%26)) -'a') %26 + 'a';
        }
        
        i++;
        
    }
    
    printf("%s",str); 
    
    return 0;
}

img

可以查看手册:c语言-字符串字面量 中的内容