代码小白斌少 发表于 2023-12-28 20:53:51

s1e22动动手strcat

#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;
      char str3;
      
      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,str3,str3,str3);

      return 0;
}

str1和str2都已经加进去str3了,为何只打印了str1。我已经想了一天了,要崩溃了,有没有大佬帮帮忙

FishC 发表于 2023-12-28 20:54:06

你的代码存在一些问题。首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这样会导致在使用fgets函数时出现段错误。正确的声明方式应该是:

char str1;
char str2;
char str3;

其次,在将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 1024

int main()
{
char str1;
char str2;
char str3;

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 小助理,如未能正确解答您的问题,请继续追问。

代码小白斌少 发表于 2023-12-29 12:50:50

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

你的代码打印结果还是只有str1,还是错的呀

FishC 发表于 2023-12-29 12:51:02

代码小白斌少 发表于 2023-12-29 12:50
你的代码打印结果还是只有str1,还是错的呀

非常抱歉,看来我犯了一个错误。在将str1和str2的内容拼接到str3时,我们需要使用字符串连接函数strcat而不是逐个字符复制。请将代码修改为以下形式:

#include <stdio.h>
#include <string.h>

#define MAX 1024

int main(){
    char str1;
    char str2;
    char str3; // 结果最大长度是两个字符串的长度之和
   
    printf("请输入第一个字符串:");
    fgets(str1, MAX, stdin);
    str1 = '\0'; // 移除输入字符串中的换行符
   
    printf("请输入第二个字符串:");
    fgets(str2, MAX, stdin);
    str2 = '\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 小助理,如未能正确解答您的问题,请继续追问。

代码小白斌少 发表于 2023-12-29 12:58:59

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

题目就是不能用strcat函数。为什么不能逐个复制字符呢?

FishC 发表于 2023-12-29 12:59:10

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

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

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

以下是修改后的代码:

#include <stdio.h>
#define MAX 1024

int main() {
    char str1;
    char str2;
    char str3;// 结果最大长度是两个字符串的长度之和
   
    printf("请输入第一个字符串:");
    fgets(str1, MAX, stdin);
    str1 = '\0'; // 移除输入字符串中的换行符
   
    printf("请输入第二个字符串:");
    fgets(str2, MAX, stdin);
    str2 = '\0'; // 移除输入字符串中的换行符
   
    int i = 0;
    while (str1 != '\0') {
      str3 = str1;
      i++;
    }
   
    int j = 0;
    while (str2 != '\0') {
      str3 = str2;
      j++;
    }
    str3 = '\0';
   
    printf("连接后的结果是:%s\n", str3);
   
    return 0;
}

在这段代码中,我们通过循环逐个复制字符的方式将str1和str2的内容复制到str3中。最后,我们添加了字符串结束标志'\0',并使用printf打印出连接后的结果。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

代码小白斌少 发表于 2023-12-29 13:01:06

FishC 发表于 2023-12-29 12:59
非常抱歉之前给出的答案有误。

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

为什么用指针逐个复制字符就会出错呢?

FishC 发表于 2023-12-29 13:01:21

代码小白斌少 发表于 2023-12-29 13:01
为什么用指针逐个复制字符就会出错呢?

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

首先,你声明了str1、str2和str3为字符变量,而不是字符数组。这将导致在使用fgets函数时出现段错误。正确的声明方式应该是:

char str1;
char str2;
char str3;// 结果最大长度是两个字符串的长度之和

其次,在将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 1024

int main() {
    char str1;
    char str2;
    char str3;// 结果最大长度是两个字符串的长度之和

    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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: s1e22动动手strcat