寻找一种更好的方法来转换C中的字符数组

时间:2017-10-15 03:40:59

标签: c arrays string

练习即将进行的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;

}

3 个答案:

答案 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}})可以轻松完成。