m0_71469623 2022-06-24 14:05 采纳率: 89.5%
浏览 83
已结题

c语言 字符串移动n位

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

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

  • 写回答

2条回答 默认 最新

  • a5156520 2022-06-24 15:01
    关注

    我的思路是:
    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月2日
  • 已采纳回答 6月24日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题