ascii 字母字符串移动n位

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

#include <stdio.h>

int main(void){

char str[200]={'\0'};
int n;
gets(str);
int r = scanf("%d",&n);

if(r!=1){
    printf("Input Error : not number");
    return 0;
}

if(n<-100){
    printf("Input Error : -101 or less");
    return 0;
}

if(n>100){
    printf("Input Error : 101 or more");
    return 0;
}

int i=0;
while(str[i]!='\0'){
    
    if(str[i]>='A'&&str[i]<='Z'){
        str[i] = ((str[i]+ (n%26)) -'A') %26 + 'A';
    }
    if(str[i]>='a'&&str[i]<='z'){ 
        str[i] = ((str[i]+ (n%26)) -'a') %26 + 'a';
    }
    i++;     
}

printf("%s",str); 

return 0;

}

想问一下这段程序为什么test case会部分error,求问应该怎么修改,或者有什么其他写法吗?谢谢。

printf("Input Error : not number"); 修改为: printf("not number");
printf("Input Error : -101 or less"); 修改为: printf(" -101 or less");
printf("Input Error : 101 or more"); 修改为:printf("101 or more");
其它没发现有问题。

/*
你这两个式子都是有问题的
str[i] = ((str[i]+ (n%26)) -'A') %26 + 'A';
str[i] = ((str[i]+ (n%26)) -'a') %26 + 'a';

假如n=-3时,str[i]=a时 代入式子
为:(a+(-3)-a)%26+a
相当于a向后移动了3位,变成^了,超出范围了。
a的ascii码97,后移3位,ascii码就是94,94对应的字符是^。

式子搞那么复杂,不知道你是如何推算的。

同理另外一个式子也是有问题的,不就不做分析了。

*/

看看我这个,按照你题目要求写的,代码仅供参考!
谢谢!

img

img

img


#include<stdio.h>
#include<ctype.h>

// 移位
int changesStr(char *s, int n)
{
    int c, n1;
    if (n < -100)
    {
        fprintf(stdout, "-101 or less\n");
        exit(-1);
    }
    else if (n > 100)
    {
        fprintf(stdout, "101 or more\n");
        exit(-2);
    }
    for (int i = 0; *(s + i) != '\0'; i++)
    {                     
        n1 = n >= 0 ? n : (26*4+n);
        c = *(s + i) + n1;
        if (islower(*(s + i)))
        {
            *(s + i) = (c - 97) % 26 + 'a';
        }
        else if (isupper(*(s + i)))
        {
            *(s + i) = (c - 65) % 26 + 'A';
        }

    }
    return 0;
}

int main()
{

    char str[200] = { '\0' };
    int n;
    // gets(str);
    fgets(str,65,stdin);
    //最多可以读取64个字符,不包括换行符,超出无效。
    int r = scanf("%d", &n);

    if (r != 1)
    {
        printf("Input Error : not number");
        return 0;
    }
    
    //开始移位
    changesStr(str,n);
    
    printf("%s", str);

    return 0;
}
你可以参考下这篇文章:ASCII码排序