artistlu 发表于 2017-11-19 15:22:11

while (n-- && (*target2++ = *target1++) != '\0') 复制串长度不是n

本帖最后由 artistlu 于 2017-11-19 15:24 编辑

#include <stdio.h>

int main()
{
   //字符改为abcdef 就能打印abc(好奇怪)
   char str[] = "abcdef";
   char str2[] = "";
   char *target1 = str;
   char *target2 = str2;
   int n = 3;
   while (n-- && ((*target2++ = *target1++) != '\0'))
   {
      
      printf("%d->%c\n", n, *(target1-1));
   }

   printf("%s\n", str2);
   

BngThea 发表于 2017-11-19 16:18:47

与运算会短路,你设置了n为3,三次循环以后n为零,后面的自增运算都不会执行了

artistlu 发表于 2017-11-19 16:42:22

BngThea 发表于 2017-11-19 16:18
与运算会短路,你设置了n为3,三次循环以后n为零,后面的自增运算都不会执行了

就是为了不执行,复制n个字符啊,怪就怪在会复制所有字符 ,然后吧str增加一个字符就和预期一样了

BngThea 发表于 2017-11-19 16:59:57

artistlu 发表于 2017-11-19 16:42
就是为了不执行,复制n个字符啊,怪就怪在会复制所有字符 ,然后吧str增加一个字符就和预期一样了

你把数组名交给了指针,当然通过指针能访问所有数据

artistlu 发表于 2017-11-19 17:24:53

本帖最后由 artistlu 于 2017-11-19 17:27 编辑

BngThea 发表于 2017-11-19 16:59
你把数组名交给了指针,当然通过指针能访问所有数据

#include <stdio.h>

int main()
{
   char str[] = "abcdefx";
   char str2[] = "";
   char *target1 = str;
   char *target2 = str2;
   int n = 3;
   while (n-- && ((*target2++ = *target1++) != '\0'))
   {
      
      printf("%d->%c\n", n, *(target1-1));
   }
   
   
   printf("%s\n", str2);
} 这个和上面的 只是字符串多一个字母,但是打印就只有三个字符 abc而帖子里的却打印多于三个字符(如果不给结束符‘\0’)

3-3 发表于 2017-11-19 18:18:42

artistlu 发表于 2017-11-19 17:24
这个和上面的 只是字符串多一个字母,但是打印就只有三个字符 abc而帖子里的却打印多于三个字符(如 ...

char str2[] = "";
我觉得这个地方就有问题,按照这么定义一个数组,那后面使用的时候肯定会越界,就算不出错,那也是巧合。

artistlu 发表于 2017-11-19 20:42:41

3-3 发表于 2017-11-19 18:18
char str2[] = "";
我觉得这个地方就有问题,按照这么定义一个数组,那后面使用的时候肯定会越界,就 ...

出现这种情况,就是因为越界,以后我注意初始化数组长度
页: [1]
查看完整版本: while (n-- && (*target2++ = *target1++) != '\0') 复制串长度不是n