鱼C论坛

 找回密码
 立即注册
查看: 1235|回复: 8

[已解决]悬赏 函数

[复制链接]
发表于 2023-11-29 18:00:09 | 显示全部楼层 |阅读模式
8鱼币
定义函数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[i] != '\0' && j >= 0) 
    {        
        new_s[k] = s1[i];   
        k++;
        new_s[k] = s2[j];   
        k++;  
        i++;        
        j--;    
    }      
    while (s1[i] != '\0') 
    {        
        new_s[k] = s1[i];   
        k++;
        i++;
    }   
     while (s2[j] != '\0') 
    {        
        new_s[k] = s2[j];   
        k++;
        j--;
    }      
    // 在新字符串的结尾添加空字符    
    new_s[k] = '\0';
}
    int main() 
    {   
        char s1[128] = {0};
        char s2[128] = {0};
        printf("请输入两个字符串:\n");
        scanf("%s %s",s1,s2);
        int char_len = strlen(s1)+strlen(s2);
        char new_s[char_len];      
        mystrcat(s1, s2, new_s);      
        printf("连接后的字符串: %s\n", new_s);      
        return 0;
    }

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

最佳答案

查看完整内容

好的,现在可以了 结果展示: 请输入两个字符串: abcd dcba 连接后的字符串: aabbccdd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i] != '\0' && j >= 0) 
    {        
        new_s[k] = s1[i];   
        k++;
        new_s[k] = s2[j];   
        k++;  
        i++;        
        j--;    
    }      
    while (s1[i] != '\0') 
    {        
        new_s[k] = s1[i];   
        k++;
        i++;
    }   
     while (s2[j] != '\0') 
    {        
        new_s[k] = s2[j];   
        k++;
        j--;
    }      
    // 在新字符串的结尾添加空字符    
    new_s[k] = '\0';
}
    int main() 
    {   
        char s1[128] = {0};
        char s2[128] = {0};
        printf("请输入两个字符串:\n");
        scanf("%s %s",s1,s2);
        int char_len = strlen(s1)+strlen(s2);
        char new_s[char_len];      
        mystrcat(s1, s2, new_s);      
        printf("连接后的字符串: %s\n", new_s);      
        return 0;
    }

结果展示:
请输入两个字符串:
abcd dcba
连接后的字符串: aabbccdd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[100];     // 储存结果的数组,需要保证有足够的空间    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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-29 18:00:54 | 显示全部楼层
不要其他地方抄来的,希望是自己写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[9];            // 目标字符串,长度应为两个源字符串长度之和加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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不需要测试用例,写通用代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[sizeof(str1) + sizeof(str2) - 1];  // -1是因为两个字符串都已经包含了'\0'mystrcat(str1, str2, new_str);// 现在new_str中包含了交叉连接后的结果
请记住,上面给出的调用代码是例子,实际调用时需要根据实际情况进行适当的修改。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i] != '\0'&& s2[i] != '\0') 
    {        
        new_s[k] = s1[i];   
        k++;
        new_s[k] = s2[i];   
        k++;  
        i++;        
        j++;    
    }      
    while (s1[i] != '\0') 
    {        
        new_s[k] = s1[i];   
        k++;
    }   
     while (s2[i] != '\0') 
    {        
        new_s[k] = s2[i];   
        k++;
    }      
    // 在新字符串的结尾添加空字符    
    new_s[k] = '\0';
}
    int main() 
    {   
        char s1[128] = {0};
        char s2[128] = {0};
        printf("请输入两个字符串:\n");
        scanf("%s %s",s1,s2);
        int char_len = strlen(s1)+strlen(s2);
        char new_s[char_len];      
        mystrcat(s1, s2, new_s);      
        printf("连接后的字符串: %s\n", new_s);      
        return 0;
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

第二个字符串要倒序和第一个交叉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表