鱼C论坛

 找回密码
 立即注册
查看: 939|回复: 7

[已解决]s1e22动动手strcat

[复制链接]
发表于 2023-12-28 20:53:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

#define MAX 1024

int main()
{
        char str1[MAX];
        char str2[MAX];
        char str3[MAX];
        
        char *target1 = str1;
        char *target2 = str2;
        char *target3 = str3;
        int i=0;

        printf("请输入第一个字符串:");
        fgets(str1, MAX, stdin);
        
        printf("请输入第二个字符串:");
        fgets(str2, MAX, stdin);


        while ((*target3++=*target1++) != '\n')
        {
                
             i++;
        }
        
        while ((*(target3+i)=*target2++) != '\0')
        {
            
            i++ ;
        }
        printf("%d\n",i);
        printf("%c\n",*(target3+3)); 
                printf("%c\n",*(target3+2));
        printf("连接后的结果是:%c%c%c%c\n", str3[0],str3[1],str3[2],str3[3]);

        return 0;
}

str1和str2都已经加进去str3了,为何只打印了str1。我已经想了一天了,要崩溃了,有没有大佬帮帮忙
最佳答案
2023-12-29 13:01:21
代码小白斌少 发表于 2023-12-29 13:01
为什么用指针逐个复制字符就会出错呢?

非常抱歉之前的回答有误。使用指针逐个复制字符的方式是可以实现字符串拼接的,但是你之前的代码存在一些问题。

首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这将导致在使用fgets函数时出现段错误。正确的声明方式应该是:
char str1[MAX];char str2[MAX];char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
char *target1 = str1;char *target2 = str2;char *target3 = str3;
然后,在循环内部,你需要将target3、target1和target2指针逐一增加,以复制字符和移动指针位置。修改后的循环应该如下:
while (*target1 != '\0') {    *target3 = *target1;    target1++;    target3++;}while (*target2 != '\0') {    *target3 = *target2;    target2++;    target3++;}
最后,如果你想要在连接后的结果上直接进行打印,可以将str3作为一个字符串进行输出,而不是单个字符。修改打印语句为:
printf("连接后的结果是:%s\n", str3);
请注意,以上修改后的代码完整示例如下:
#include <stdio.h>#define MAX 1024int main() {    char str1[MAX];    char str2[MAX];    char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和    char *target1 = str1;    char *target2 = str2;    char *target3 = str3;    printf("请输入第一个字符串:");    fgets(str1, MAX, stdin);    printf("请输入第二个字符串:");    fgets(str2, MAX, stdin);    while (*target1 != '\0') {        *target3 = *target1;        target1++;        target3++;    }    while (*target2 != '\0') {        *target3 = *target2;        target2++;        target3++;    }    *target3 = '\0';    printf("连接后的结果是:%s\n", str3);    return 0;}
希望这次能够满足你的要求!如果还有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
屏幕截图 2023-12-28 204815.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-28 20:54:06 | 显示全部楼层
你的代码存在一些问题。首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这样会导致在使用fgets函数时出现段错误。正确的声明方式应该是:
char str1[MAX];char str2[MAX];char str3[MAX*2];
其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
char *target1 = str1;char *target2 = str2;char *target3 = str3;
此外,你在打印连接后的结果时使用了错误的输出格式,应该使用%s而不是%c。应该修改为:
printf("连接后的结果是:%s\n", str3);
最后,你需要注意的是,str1和str2的末尾有换行符'\n',在拼接时需要跳过它们。应该修改为:
while ((*target3++ = *target1++) != '\n'){  i++;}target3--; // 跳过第一个字符串的末尾换行符while ((*(target3+i) = *target2++) != '\0'){  i++;}
修改后的完整代码如下:
#include <stdio.h>#define MAX 1024int main(){  char str1[MAX];  char str2[MAX];  char str3[MAX*2];    char *target1 = str1;  char *target2 = str2;  char *target3 = str3;  int i = 0;  printf("请输入第一个字符串:");  fgets(str1, MAX, stdin);  printf("请输入第二个字符串:");  fgets(str2, MAX, stdin);  while ((*target3++ = *target1++) != '\n')  {    i++;  }  target3--; // 跳过第一个字符串的末尾换行符  while ((*(target3+i) = *target2++) != '\0')  {    i++;  }  printf("连接后的结果是:%s\n", str3);  return 0;}
希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-29 12:50:50 | 显示全部楼层
FishC 发表于 2023-12-28 20:54
你的代码存在一些问题。首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这样会导致在使用fget ...

你的代码打印结果还是只有str1,还是错的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-29 12:51:02 | 显示全部楼层
代码小白斌少 发表于 2023-12-29 12:50
你的代码打印结果还是只有str1,还是错的呀

非常抱歉,看来我犯了一个错误。在将str1和str2的内容拼接到str3时,我们需要使用字符串连接函数strcat而不是逐个字符复制。请将代码修改为以下形式:
#include <stdio.h>#include <string.h>#define MAX 1024int main(){    char str1[MAX];    char str2[MAX];    char str3[MAX*2]; // 结果最大长度是两个字符串的长度之和        printf("请输入第一个字符串:");    fgets(str1, MAX, stdin);    str1[strcspn(str1, "\n")] = '\0'; // 移除输入字符串中的换行符        printf("请输入第二个字符串:");    fgets(str2, MAX, stdin);    str2[strcspn(str2, "\n")] = '\0'; // 移除输入字符串中的换行符        strcpy(str3, str1); // 将str1复制到str3    strcat(str3, str2); // 将str2追加到str3        printf("连接后的结果是:%s\n", str3);        return 0;}
这段代码使用了`strcpy`函数将str1复制到str3,然后使用`strcat`函数将str2追加到str3的末尾。最后,我们使用printf打印出连接后的结果。

希望这次能够解决你的问题!如果还有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-29 12:58:59 | 显示全部楼层
FishC 发表于 2023-12-29 12:51
非常抱歉,看来我犯了一个错误。在将str1和str2的内容拼接到str3时,我们需要使用字符串连接函数strcat而 ...

题目就是不能用strcat函数。为什么不能逐个复制字符呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-29 12:59:10 | 显示全部楼层
代码小白斌少 发表于 2023-12-29 12:58
题目就是不能用strcat函数。为什么不能逐个复制字符呢 ...

非常抱歉之前给出的答案有误。

如果你不想使用strcat函数,那么可以通过逐个复制字符的方式来实现字符串的拼接。

以下是修改后的代码:
#include <stdio.h>#define MAX 1024int main() {    char str1[MAX];    char str2[MAX];    char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和        printf("请输入第一个字符串:");    fgets(str1, MAX, stdin);    str1[strlen(str1)-1] = '\0'; // 移除输入字符串中的换行符        printf("请输入第二个字符串:");    fgets(str2, MAX, stdin);    str2[strlen(str2)-1] = '\0'; // 移除输入字符串中的换行符        int i = 0;    while (str1[i] != '\0') {        str3[i] = str1[i];        i++;    }        int j = 0;    while (str2[j] != '\0') {        str3[i+j] = str2[j];        j++;    }    str3[i+j] = '\0';        printf("连接后的结果是:%s\n", str3);        return 0;}
在这段代码中,我们通过循环逐个复制字符的方式将str1和str2的内容复制到str3中。最后,我们添加了字符串结束标志'\0',并使用printf打印出连接后的结果。

希望这次能够满足你的要求!如果还有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-29 13:01:06 | 显示全部楼层
FishC 发表于 2023-12-29 12:59
非常抱歉之前给出的答案有误。

如果你不想使用strcat函数,那么可以通过逐个复制字符的方式来实现字符串 ...

为什么用指针逐个复制字符就会出错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-29 13:01:21 | 显示全部楼层    本楼为最佳答案   
代码小白斌少 发表于 2023-12-29 13:01
为什么用指针逐个复制字符就会出错呢?

非常抱歉之前的回答有误。使用指针逐个复制字符的方式是可以实现字符串拼接的,但是你之前的代码存在一些问题。

首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这将导致在使用fgets函数时出现段错误。正确的声明方式应该是:
char str1[MAX];char str2[MAX];char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
char *target1 = str1;char *target2 = str2;char *target3 = str3;
然后,在循环内部,你需要将target3、target1和target2指针逐一增加,以复制字符和移动指针位置。修改后的循环应该如下:
while (*target1 != '\0') {    *target3 = *target1;    target1++;    target3++;}while (*target2 != '\0') {    *target3 = *target2;    target2++;    target3++;}
最后,如果你想要在连接后的结果上直接进行打印,可以将str3作为一个字符串进行输出,而不是单个字符。修改打印语句为:
printf("连接后的结果是:%s\n", str3);
请注意,以上修改后的代码完整示例如下:
#include <stdio.h>#define MAX 1024int main() {    char str1[MAX];    char str2[MAX];    char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和    char *target1 = str1;    char *target2 = str2;    char *target3 = str3;    printf("请输入第一个字符串:");    fgets(str1, MAX, stdin);    printf("请输入第二个字符串:");    fgets(str2, MAX, stdin);    while (*target1 != '\0') {        *target3 = *target1;        target1++;        target3++;    }    while (*target2 != '\0') {        *target3 = *target2;        target2++;        target3++;    }    *target3 = '\0';    printf("连接后的结果是:%s\n", str3);    return 0;}
希望这次能够满足你的要求!如果还有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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