输入文字列(最大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对应的字符是^。
式子搞那么复杂,不知道你是如何推算的。
同理另外一个式子也是有问题的,不就不做分析了。
*/
看看我这个,按照你题目要求写的,代码仅供参考!
谢谢!
#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码排序