【问题标题】:Swap each even pair of characters with next pair of characters in array将每个偶数对字符与数组中的下一对字符交换
【发布时间】:2018-02-24 14:19:30
【问题描述】:

我想创建一个函数,将字符串拆分为两组字符,一个字符一个字符,然后将第二个字符集在第一个字符集之前,一个字符一个字符地合并。例如,字符串 "KILOS" (odd # of chars) 将拆分为 "KL" "IO" 然后“S”,其中最终输出看起来像“IKOLS”。对于每个奇数情况,原始字符串中的最后一个字符在新字符串中的最后一个位置。编码函数期望 s2 指向一个包含从 s1 转换而来的字符串的字符串。任何帮助,提示将不胜感激!谢谢。

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

【问题讨论】:

  • 我想我不明白这个问题。
  • 嘿,很抱歉,但这是我的老师发布问题的方式。他给了我们这个输出输入一个词:合并输出:emgrnig
  • 所以它是在交换连续的字符?
  • 没错。用户输入一个词,然后我们只是合并两个集合。
  • @coderredoc - 我相信他是在说“从字符串中取出偶数个字符 pairs(将它们分成奇数/偶数),如果有最后一个奇数字符-- 将其附加在编码字符串的末尾。否则,只需将编码字符串作为奇/偶/奇/偶放在一起。(交换每组对中的每个字符)

标签: c string pointers char


【解决方案1】:

问题是你写的代码很复杂,简单循环字符串就可以解决问题。

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) 相同。

编辑1

另外,在你修改我的代码的最后一行中,你已经输入了*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
}

【讨论】:

  • 你好@coderredoc 非常感谢。该程序在实施时不显示输出。我已经更新了问题中的当前代码。另外,老师说不要使用下标,他想要指针运算中的所有内容。最后一件事,我们还没有学习 size_t,所以我将使用其他东西。
  • @Ulta.: 你自己用过数组下标吗?不要等老师教你——strlensize_t 中返回长度,此代码功能齐全。
  • 是的,我使用了sub scripting,但是他说不要在函数中使用subscribing。是的,先生,我已经看到用 size_of 引入的 size_t。此外,我不是在评判你的反应,我说的是我的程序的行为方式......我的程序说,输入一个单词然后我按回车,没有输出。
  • @Ulta.: 对不起,你可以把它改成这样的s[i]*(s+i)。而且我还编写了该函数的代码 - 您必须与现有代码集成。
  • void encode(char *s1, char *s2) { size_t len = strlen(s1); for( size_t i = 0; i &lt; len; i+=2 ){ if(i+1 &lt; len){ *(s2+i+1) = *(s1+i); *(s2+i) = *(s1+i+1); }else{ *(s2+i) = *(s1+i); } } *s2='\0'; }
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 2020-11-27
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多