鱼C论坛

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

[已解决]s1e22动动手strcat

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

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

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

x
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str1[MAX];
  6.         char str2[MAX];
  7.         char str3[MAX];
  8.         
  9.         char *target1 = str1;
  10.         char *target2 = str2;
  11.         char *target3 = str3;
  12.         int i=0;

  13.         printf("请输入第一个字符串:");
  14.         fgets(str1, MAX, stdin);
  15.         
  16.         printf("请输入第二个字符串:");
  17.         fgets(str2, MAX, stdin);


  18.         while ((*target3++=*target1++) != '\n')
  19.         {
  20.                
  21.              i++;
  22.         }
  23.         
  24.         while ((*(target3+i)=*target2++) != '\0')
  25.         {
  26.             
  27.             i++ ;
  28.         }
  29.         printf("%d\n",i);
  30.         printf("%c\n",*(target3+3));
  31.                 printf("%c\n",*(target3+2));
  32.         printf("连接后的结果是:%c%c%c%c\n", str3[0],str3[1],str3[2],str3[3]);

  33.         return 0;
  34. }
复制代码


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

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

首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这将导致在使用fgets函数时出现段错误。正确的声明方式应该是:
  1. char str1[MAX];
  2. char str2[MAX];
  3. char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
复制代码

其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
  1. char *target1 = str1;
  2. char *target2 = str2;
  3. char *target3 = str3;
复制代码

然后,在循环内部,你需要将target3、target1和target2指针逐一增加,以复制字符和移动指针位置。修改后的循环应该如下:
  1. while (*target1 != '\0') {
  2.     *target3 = *target1;
  3.     target1++;
  4.     target3++;
  5. }
  6. while (*target2 != '\0') {
  7.     *target3 = *target2;
  8.     target2++;
  9.     target3++;
  10. }
复制代码

最后,如果你想要在连接后的结果上直接进行打印,可以将str3作为一个字符串进行输出,而不是单个字符。修改打印语句为:
  1. printf("连接后的结果是:%s\n", str3);
复制代码

请注意,以上修改后的代码完整示例如下:
  1. #include <stdio.h>
  2. #define MAX 1024
  3. int main() {
  4.     char str1[MAX];
  5.     char str2[MAX];
  6.     char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
  7.     char *target1 = str1;
  8.     char *target2 = str2;
  9.     char *target3 = str3;
  10.     printf("请输入第一个字符串:");
  11.     fgets(str1, MAX, stdin);
  12.     printf("请输入第二个字符串:");
  13.     fgets(str2, MAX, stdin);
  14.     while (*target1 != '\0') {
  15.         *target3 = *target1;
  16.         target1++;
  17.         target3++;
  18.     }
  19.     while (*target2 != '\0') {
  20.         *target3 = *target2;
  21.         target2++;
  22.         target3++;
  23.     }
  24.     *target3 = '\0';
  25.     printf("连接后的结果是:%s\n", str3);
  26.     return 0;
  27. }
复制代码

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

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

使用道具 举报

发表于 2023-12-28 20:54:06 | 显示全部楼层
你的代码存在一些问题。首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这样会导致在使用fgets函数时出现段错误。正确的声明方式应该是:
  1. char str1[MAX];
  2. char str2[MAX];
  3. char str3[MAX*2];
复制代码

其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
  1. char *target1 = str1;
  2. char *target2 = str2;
  3. char *target3 = str3;
复制代码

此外,你在打印连接后的结果时使用了错误的输出格式,应该使用%s而不是%c。应该修改为:
  1. printf("连接后的结果是:%s\n", str3);
复制代码

最后,你需要注意的是,str1和str2的末尾有换行符'\n',在拼接时需要跳过它们。应该修改为:
  1. while ((*target3++ = *target1++) != '\n')
  2. {
  3.   i++;
  4. }
  5. target3--; // 跳过第一个字符串的末尾换行符
  6. while ((*(target3+i) = *target2++) != '\0')
  7. {
  8.   i++;
  9. }
复制代码

修改后的完整代码如下:
  1. #include <stdio.h>
  2. #define MAX 1024
  3. int main()
  4. {
  5.   char str1[MAX];
  6.   char str2[MAX];
  7.   char str3[MAX*2];
  8.   
  9.   char *target1 = str1;
  10.   char *target2 = str2;
  11.   char *target3 = str3;
  12.   int i = 0;
  13.   printf("请输入第一个字符串:");
  14.   fgets(str1, MAX, stdin);
  15.   printf("请输入第二个字符串:");
  16.   fgets(str2, MAX, stdin);
  17.   while ((*target3++ = *target1++) != '\n')
  18.   {
  19.     i++;
  20.   }
  21.   target3--; // 跳过第一个字符串的末尾换行符
  22.   while ((*(target3+i) = *target2++) != '\0')
  23.   {
  24.     i++;
  25.   }
  26.   printf("连接后的结果是:%s\n", str3);
  27.   return 0;
  28. }
复制代码

希望能帮到你!

以上回复来自 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而不是逐个字符复制。请将代码修改为以下形式:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 1024
  4. int main(){
  5.     char str1[MAX];
  6.     char str2[MAX];
  7.     char str3[MAX*2]; // 结果最大长度是两个字符串的长度之和
  8.    
  9.     printf("请输入第一个字符串:");
  10.     fgets(str1, MAX, stdin);
  11.     str1[strcspn(str1, "\n")] = '\0'; // 移除输入字符串中的换行符
  12.    
  13.     printf("请输入第二个字符串:");
  14.     fgets(str2, MAX, stdin);
  15.     str2[strcspn(str2, "\n")] = '\0'; // 移除输入字符串中的换行符
  16.    
  17.     strcpy(str3, str1); // 将str1复制到str3
  18.     strcat(str3, str2); // 将str2追加到str3
  19.    
  20.     printf("连接后的结果是:%s\n", str3);
  21.    
  22.     return 0;
  23. }
复制代码

这段代码使用了`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函数,那么可以通过逐个复制字符的方式来实现字符串的拼接。

以下是修改后的代码:
  1. #include <stdio.h>
  2. #define MAX 1024
  3. int main() {
  4.     char str1[MAX];
  5.     char str2[MAX];
  6.     char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
  7.    
  8.     printf("请输入第一个字符串:");
  9.     fgets(str1, MAX, stdin);
  10.     str1[strlen(str1)-1] = '\0'; // 移除输入字符串中的换行符
  11.    
  12.     printf("请输入第二个字符串:");
  13.     fgets(str2, MAX, stdin);
  14.     str2[strlen(str2)-1] = '\0'; // 移除输入字符串中的换行符
  15.    
  16.     int i = 0;
  17.     while (str1[i] != '\0') {
  18.         str3[i] = str1[i];
  19.         i++;
  20.     }
  21.    
  22.     int j = 0;
  23.     while (str2[j] != '\0') {
  24.         str3[i+j] = str2[j];
  25.         j++;
  26.     }
  27.     str3[i+j] = '\0';
  28.    
  29.     printf("连接后的结果是:%s\n", str3);
  30.    
  31.     return 0;
  32. }
复制代码

在这段代码中,我们通过循环逐个复制字符的方式将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函数时出现段错误。正确的声明方式应该是:
  1. char str1[MAX];
  2. char str2[MAX];
  3. char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
复制代码

其次,在将str1和str2的内容拼接到str3中时,你通过target1和target2指针来逐个字符复制,但是你没有正确初始化target1和target2指针,也没有将它们指向str1和str2。正确的方式应该是:
  1. char *target1 = str1;
  2. char *target2 = str2;
  3. char *target3 = str3;
复制代码

然后,在循环内部,你需要将target3、target1和target2指针逐一增加,以复制字符和移动指针位置。修改后的循环应该如下:
  1. while (*target1 != '\0') {
  2.     *target3 = *target1;
  3.     target1++;
  4.     target3++;
  5. }
  6. while (*target2 != '\0') {
  7.     *target3 = *target2;
  8.     target2++;
  9.     target3++;
  10. }
复制代码

最后,如果你想要在连接后的结果上直接进行打印,可以将str3作为一个字符串进行输出,而不是单个字符。修改打印语句为:
  1. printf("连接后的结果是:%s\n", str3);
复制代码

请注意,以上修改后的代码完整示例如下:
  1. #include <stdio.h>
  2. #define MAX 1024
  3. int main() {
  4.     char str1[MAX];
  5.     char str2[MAX];
  6.     char str3[MAX*2];  // 结果最大长度是两个字符串的长度之和
  7.     char *target1 = str1;
  8.     char *target2 = str2;
  9.     char *target3 = str3;
  10.     printf("请输入第一个字符串:");
  11.     fgets(str1, MAX, stdin);
  12.     printf("请输入第二个字符串:");
  13.     fgets(str2, MAX, stdin);
  14.     while (*target1 != '\0') {
  15.         *target3 = *target1;
  16.         target1++;
  17.         target3++;
  18.     }
  19.     while (*target2 != '\0') {
  20.         *target3 = *target2;
  21.         target2++;
  22.         target3++;
  23.     }
  24.     *target3 = '\0';
  25.     printf("连接后的结果是:%s\n", str3);
  26.     return 0;
  27. }
复制代码

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 15:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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