输入文字列和大于等于-100小于等于100的数字n,输出把原字符串按字母表移动n次的字符串。
输入的n不是数字时,输出 not number;
输出的n小于-100时 输出 -101 or less;
输出的n大于100时,输出 101 or more;
(文字列内除字母外的其他数字、字符不变,大写字母小写字母不互换,z右移一位为a)
分开好像都会写但是合起来就一直在error,求问应该怎么写。谢谢
输入文字列和大于等于-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;
}