小羊爱吃小草 发表于 2023-11-29 18:00:09

悬赏 函数

定义函数void mystrcat(char*s1,char*s2,char*new_s)实现对两个字符串交叉连接,如a4b3c2d1(用c,不涉及c++)

渔村暮火 发表于 2023-11-29 18:00:10

小羊爱吃小草 发表于 2023-11-29 19:37
第二个字符串要倒序和第一个交叉

好的,现在可以了
#include <stdio.h>
#include <string.h>
void mystrcat(char *s1, char *s2, char *new_s)
{   
    int i = 0, j = strlen(s2)-1,k = 0;
    while (s1 != '\0' && j >= 0)
    {      
      new_s = s1;   
      k++;
      new_s = s2;   
      k++;
      i++;      
      j--;   
    }      
    while (s1 != '\0')
    {      
      new_s = s1;   
      k++;
      i++;
    }   
   while (s2 != '\0')
    {      
      new_s = s2;   
      k++;
      j--;
    }      
    // 在新字符串的结尾添加空字符   
    new_s = '\0';
}
    int main()
    {   
      char s1 = {0};
      char s2 = {0};
      printf("请输入两个字符串:\n");
      scanf("%s %s",s1,s2);
      int char_len = strlen(s1)+strlen(s2);
      char new_s;      
      mystrcat(s1, s2, new_s);      
      printf("连接后的字符串: %s\n", new_s);      
      return 0;
    }


结果展示:
请输入两个字符串:
abcd dcba
连接后的字符串: aabbccdd

FishC_GPT 发表于 2023-11-29 18:00:51

要实现这个功能,首先需要理解如何逐个字符遍历字符串,并且交叉连接两个字符串。在C语言中,字符串以字符数组的形式出现,并以`'\0'`(空字符)结尾。以下是实现你要求的函数的一个例子:

#include <stdio.h>

void mystrcat(char *s1, char *s2, char *new_s) {
    // 遍历两个字符串,交替添加字符到new_s中
    while (*s1 != '\0' || *s2 != '\0') {
      if (*s1 != '\0') {
            // 如果s1还有字符,就添加到new_s中
            *new_s++ = *s1++;
      }
      if (*s2 != '\0') {
            // 如果s2还有字符,就添加到new_s中
            *new_s++ = *s2++;
      }
    }

    // 字符串结尾需要添加'\0'
    *new_s = '\0';
}

int main() {
    char str1[] = "abcd"; // 示例字符串1
    char str2[] = "4321"; // 示例字符串2
    char result;   // 储存结果的数组,需要保证有足够的空间

    mystrcat(str1, str2, result);

    // 打印结果
    printf("Resulting string: %s\n", result);

    return 0;
}

这段代码中的`mystrcat`函数会交替从`s1`和`s2`中取出字符,并将它们添加到`new_s`指向的字符串中。当两个输入字符串中的任一个到达末尾(即遇到`'\0'`)时,函数停止交叉添加。最后,我们在新字符串的末尾添加`'\0'`,确保它是一个标准的C语言字符串。在`main`函数中,我们创建了两个示例字符串,并声明了一个足够大的数组来存储结果。调用`mystrcat`函数后,得到的结果通过`printf`打印出来。

记住要确保`result`数组的大小足以容纳两个字符串的长度加上结束符`'\0'`。在上面的例子中,我指定了100个字符的大小,这通常足够用于示例。但在实际的使用中,你需要根据实际情况来确定这个大小。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

小羊爱吃小草 发表于 2023-11-29 18:00:54

不要其他地方抄来的,希望是自己写的

FishC_GPT 发表于 2023-11-29 18:01:34

小羊爱吃小草 发表于 2023-11-29 18:00
不要其他地方抄来的,希望是自己写的

抱歉刚才的回复可能让您觉得像是从其他地方抄来的,这里我将提供一个更简洁的版本,并保证是原创的示例代码。请看以下的实现:

#include <stdio.h>

// 定义函数,将两个字符串交叉连接后放入new_s中
void mystrcat(char *s1, char *s2, char *new_s) {
    while (*s1 || *s2) {// 当任一字符串未结束时继续循环
      if (*s1) {// 如果s1未结束,取s1当前字符,追加到new_s,并将s1指针后移
            *new_s++ = *s1++;
      }
      if (*s2) {// 如果s2未结束,取s2当前字符,追加到new_s,并将s2指针后移
            *new_s++ = *s2++;
      }
    }
    *new_s = '\0';// 在字符串末尾添加结束符
}

int main() {
    char s1[] = "abcd";       // 第一个源字符串
    char s2[] = "1234";       // 第二个源字符串
    char new_s;            // 目标字符串,长度应为两个源字符串长度之和加1

    mystrcat(s1, s2, new_s);// 调用函数进行字符串交叉连接

    printf("交叉连接后的字符串为: %s\n", new_s);// 输出结果

    return 0;
}

在这段代码中,`mystrcat`函数通过两个指针`s1`和`s2`分别遍历两个输入字符串。在每次循环中,它会检查对应的字符串是否已经遍历结束(即检查当前字符是否为`'\0'`)。如果未结束,就将当前字符复制到新字符串`new_s`中,并将相应的指针后移一位。

最后,不要忘记在新字符串的末尾加上`'\0'`以确保它是一个正确格式的C字符串。

`main`函数中定义了两个源字符串`s1`和`s2`以及足够长的目标字符串`new_s`以保存交叉连接后的结果。然后调用`mystrcat`函数,最后将结果通过`printf`打印出来。

请注意,`new_s`的大小应该足够大,以便能够存放两个源字符串的字符以及最后的`'\0'`。在这个例子中,源字符串总共有8个字符,所以`new_s`数组定义为9个字符长(8个字符加上一个`'\0'`)。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

小羊爱吃小草 发表于 2023-11-29 18:03:09

FishC_GPT 发表于 2023-11-29 18:01
抱歉刚才的回复可能让您觉得像是从其他地方抄来的,这里我将提供一个更简洁的版本,并保证是原创的示例代 ...

不需要测试用例,写通用代码

FishC_GPT 发表于 2023-11-29 18:03:28

小羊爱吃小草 发表于 2023-11-29 18:03
不需要测试用例,写通用代码

当然,下面是一个通用的`mystrcat`函数代码,不包含任何测试用例:

#include <stdio.h>

// 定义函数,将两个字符串交叉连接后放入new_s中
void mystrcat(char *s1, char *s2, char *new_s) {
    // 只要s1或s2有一个没有结束(不是'\0'字符),就继续循环
    while (*s1 || *s2) {
      if (*s1) {// 如果s1指向的字符不是'\0',将它追加到new_s中,并将s1指针后移
            *new_s++ = *s1++;
      }
      
      if (*s2) {// 如果s2指向的字符不是'\0',将它追加到new_s中,并将s2指针后移
            *new_s++ = *s2++;
      }
    }
   
    *new_s = '\0';// 手动追加字符串结束符'\0'
}

// 注意:调用该函数时,必须确保new_s有足够的空间来存放两个字符串交叉连接后的结果

上述代码只包含了你所要求的函数实现。在实际使用时,你需要确保传入的`new_s`数组有足够的空间来存放交叉连接后的字符串。如果`s1`和`s2`两个字符串的长度分别是`len1`和`len2`,那么`new_s`数组的长度至少需要是`len1 + len2 + 1`(加1是为了存放字符串的结束符`'\0'`)。在调用`mystrcat`函数时,就可以像这样:

char str1[] = "abc";
char str2[] = "123";
char new_str;// -1是因为两个字符串都已经包含了'\0'
mystrcat(str1, str2, new_str);
// 现在new_str中包含了交叉连接后的结果

请记住,上面给出的调用代码是例子,实际调用时需要根据实际情况进行适当的修改。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

渔村暮火 发表于 2023-11-29 19:31:20

功能已经实现,不过需要注意buf大小,最好这个函数的参数增加new_s的buf大小,如果你自己用,注意就行了
#include <stdio.h>
#include <string.h>
void mystrcat(char *s1, char *s2, char *new_s)
{   
    int i = 0, j = 0,k = 0;
    while (s1 != '\0'&& s2 != '\0')
    {      
      new_s = s1;   
      k++;
      new_s = s2;   
      k++;
      i++;      
      j++;   
    }      
    while (s1 != '\0')
    {      
      new_s = s1;   
      k++;
    }   
   while (s2 != '\0')
    {      
      new_s = s2;   
      k++;
    }      
    // 在新字符串的结尾添加空字符   
    new_s = '\0';
}
    int main()
    {   
      char s1 = {0};
      char s2 = {0};
      printf("请输入两个字符串:\n");
      scanf("%s %s",s1,s2);
      int char_len = strlen(s1)+strlen(s2);
      char new_s;      
      mystrcat(s1, s2, new_s);      
      printf("连接后的字符串: %s\n", new_s);      
      return 0;
    }

小羊爱吃小草 发表于 2023-11-29 19:37:23

渔村暮火 发表于 2023-11-29 19:31
功能已经实现,不过需要注意buf大小,最好这个函数的参数增加new_s的buf大小,如果你自己用,注意就行了

第二个字符串要倒序和第一个交叉
页: [1]
查看完整版本: 悬赏 函数