练习即将进行的C测试。制作一个程序来移动字符串中的每个字母(c中的字符数组)。
例如,如果我想将'a'移动3,那就是'd'。这个程序运行正常,但它有点像IMO的“野蛮力量”解决方案。知道如何以更好/更优雅的方式完成这项任务吗?我想到使用指针/字符串库函数/ getchar,但我仍然是新手,因此不确定如何实现它们。
想要更好的解决方案吗?寻找指南/想法,你不需要为我编写任何代码。提前谢谢。
#define N 3
int shifter(char a[],int n,int shift,char b[]);
int main(){
char a[N] = {'h','e','y'};
char b[N];
int shift = 3;
shifter(a,N,shift,b);
int i;
for(i=0;i<N;i++){
printf("%c",b[i]);
}
return 0;
}
int shifter(char a[],int n,int shift,char b[]){
int i;
for(i=0;i<N;i++){
if(a[i]>= 65 && a[i]<=90){
if (a[i]+shift > 90)
b[i] = (a[i]+shift)-26;
}
else b[i] = a[i]+shift;
if (a[i]>=97 && a[i]<= 122){
if(a[i]+shift > 122)
b[i] = (a[i]+shift)-26;
}
else b[i] = a[i]+shift;
}
return b;
}
答案 0 :(得分:2)
更喜欢使用字母文字而不是数字:
if (a[i] >= 'a' and a[i] <= 'z')
注意你的流程。目前你有
if (is lower) ...
else b[i] = something;
if (is upper) ...
else b[i] = something;
您可以将其合并为单个if并避免重复:
if (is lower) b[i] = ...
else if (is upper) b[i] = ...
else b[i] = ...
如果您被允许,您还可以通过#including并使用isupper()
和islower()
确定角色的分类。
最后,您可以使用一些模块化算法来简化表达式。
b[i] = ((a[i] - 'a') + shift) % 26 + 'a';
就个人而言,我写了一个函数来执行此操作:
char shift( char c, int shift )
使用上述功能,你可以拥有一个非常漂亮的if语句......
:O)
答案 1 :(得分:0)
谢谢大家的反馈,我试着用它来解决我最初发布的同样问题,除了这次使用指针算法。它按预期运行,希望它得到改进,并可以在将来帮助其他人。
定义N 3
int i;
void pointer_shift(char * a,int shift);
int main(){
char a[N] = {'A','b','c'};
int shift = 3;
pointer_shift(a,shift);
return 0;
}
void pointer_shift(char * a,int shift){
char b[N];
char *p = a;
char *q = b;
for(p=a;p<a+N;p++,q++)
{
if(*p >= 'a' && *p <= 'z')
{
*q = ((*p-'a')+ shift)%26+'a';
printf("%c",*q);
}
else if (*p >= 'A' && *p <= 'Z')
{
*q = ((*p-'A')+ shift)%26+'A';
printf("%c",*q);
}
else { printf(" Error: Not a Letter \n"); break;}
}
}
答案 2 :(得分:-1)
&#39; tr&#39;程序,必须从shell执行(或通过从C程序调用{{1}})可以轻松完成。