连续字符交换字符串,偶数或奇数否。的人物

时间:2018-02-24 14:19:30

标签: c string pointers char

我想创建一个函数,它将字符串分成两组字符,逐个字符,然后在第一个字符之前合并第二个字符。例如,字符串“ KILOS ”(奇数字符)将拆分为“ KL ”“ IO ”然后“ S ”,其中最终输出看起来像“ IKOLS ”。请注意,如果偶数个字符,则交换仍然相同,但“ S ”不存在。对于每个奇数情况的含义,原始字符串中的最后一个字符保留新字符串中的最后一个位置。 encode函数要求s2指向包含从s1转换的字符串的字符串。任何帮助,提示将不胜感激!谢谢。

***//I HAVE DELETED MY CODE BECAUSE I ACTUAL STUDENTS MIGHT COPY IT, AND GET CAUGHT PLAGIARIZING> SORRY>***

1 个答案:

答案 0 :(得分:2)

事情就是这里你编写的代码很复杂,简单地循环遍历字符串可以解决问题。

void convert (char *s1, char *s2){
  size_t len = strlen(s1);
  for( size_t i = 0; i < len; i+=2 ){
    if(i+1 < len){
      s2[i+1] = s1[i];
        s2[i] = s1[i+1];
    }else{
      s2[i] = s1[i];
    }
  }
  s2[len]=0;
}

如果你必须使用这样的功能: -

char s[6]="hello";
char t[6];
convert(s,t);
printf("%s\n",t);

在这里,我们认为s2有足够的内存来保存已处理的字符串。这实际上只不过是复制逻辑。您正在考虑两个字符,然后在复制时交换它们。当您访问没有对的元素(奇数个元素)时,最后到达一个位置。然后你只需复制它并继续前进。

如果您不知道数组下载的含义 - 让我告诉您,s1[i]*(s1+i)相同。

EDIT1

另外,在最后一行中我的代码改编时,你放了*s2 = 0。 它应该是

*(s2+len)=0;

另一件事是你的readline代码中你不需要这两行。你可以这样做: -

int read_line(char *str, int n)
{
    int words; int store=0;
    while((words=getchar())!='\n')
    {
        if(store<n)
        {
            *str++=words;
            store++;
        }
    }
    *str=0;
    return store;
}

void encode(char *s1, char *s2)
{
    int len = strlen(s1);
    for( int i = 0; i < len; i+=2 ){
        if(i+1 < len){
            *(s2+i+1) = *(s1+i);
            *(s2+i) = *(s1+i+1);
        }else{
            *(s2+i) = *(s1+i);
        }
    }
    *(s2+len)='\0'; //<---- note this
}