鹿酸梅 发表于 2021-3-9 18:12:10

连接两个字符串,请大神解释下带问号的3行代码的用处,谢谢

#include <stdio.h>

#define MAX 1024

int main()
{
      char str1; // 确保连接后不越界
      char str2;

      char *target1 = str1;   
      char *target2 = str2;

      char ch;
      int n;

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

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

      printf("请输入需要连接的字符个数:");
      scanf("%d", &n);

      // 将指针指向 str1 的末尾处
      while (*target1++ != '\0')
                ;
      // 我们希望 str1 最后边的 '\0' 和 '\n' 都被覆盖掉
      target1 -= 2;

      while (n--)
      {
                ch = *target1++ = *target2++;
                if (ch == '\0')
                {
                        break;
                }
                if ((int)ch < 0)
                {
                        *target1++ = *target2++;//代码1
                        *target1++ = *target2++;//代码2
                }
      }

      *target1 = '\0';   //代码3

      printf("连接后的结果是:%s\n", str1);

      return 0;
}

yuedong 发表于 2021-3-9 18:54:08

我c语言学过去就忘的差不多了
我说一下我的看法
可能不对,见谅
代码1和代码2,这里能考虑的是输入汉字的情况,可能是汉字占两个位吧,if条件说的是不在asc码表内
代码3则是在这两个合并后的结果后加上\0
因为字符串都是以\0结尾的嘛

鹿酸梅 发表于 2021-3-9 19:15:07

yuedong 发表于 2021-3-9 18:54
我c语言学过去就忘的差不多了
我说一下我的看法
可能不对,见谅


*target1++ = *target2++;这段代码为什么写两遍

yuedong 发表于 2021-3-9 19:24:55

鹿酸梅 发表于 2021-3-9 19:15
*target1++ = *target2++;这段代码为什么写两遍

。。。就是猜测汉字占了两个位,每次传递了一半。。我不知道对不对,只是这种猜测

yuedong 发表于 2021-3-9 19:26:41

猜测依据是一个汉字占两个字节,相当于两个字母

yuedong 发表于 2021-3-9 19:27:47

所以要传递两次,所以这段代码写了两次
页: [1]
查看完整版本: 连接两个字符串,请大神解释下带问号的3行代码的用处,谢谢