字符数组复制:数组与指针方式的终止符差异咨询
为什么指针版字符数组复制有时候不用手动加'\0'?
嘿,这个问题其实挺容易搞混的,我来给你掰扯清楚~首先得澄清一个点:不是所有指针版复制都不用加终止符,关键看你的指针循环是怎么写的,我们一步步拆解:
先看你的下标循环版本
你的代码写得很规范:while循环只把source里的有效字符(也就是'\0'之前的那些)复制到temp里,循环结束时i刚好指着temp里对应source中'\0'的位置,这时候必须手动加temp[i]='\0'——不然temp就不是一个合法的C风格字符串,cout输出的时候会乱读内存里的垃圾数据,直到碰巧碰到某个'\0'才停下。
再贴一遍你的代码方便对比:
char source[50] = "Hello World"; char temp[50]; int i = 0; while (source[i] != '\0') { temp[i] = source[i]; i++; } temp[i]='\0'; // 必须加,不然输出会乱 cout << temp;
再看你说的“不用加'\0'”的指针版本
你提到的指针版不用加终止符,大概率是用了一种比较巧妙的循环写法,比如这样:
char source[50] = "Hello World"; char temp[50]; char *dest_ptr = temp; char *src_ptr = source; // 重点是这个循环! while (*dest_ptr++ = *src_ptr++); cout << temp;
核心原因就在这个循环里
这个循环的条件是*dest_ptr++ = *src_ptr++——这是个赋值表达式,它的返回值就是被赋值的内容(也就是*src_ptr当前的值)。当*src_ptr走到'\0'的时候,这个赋值表达式的值就是'\0',会被当成false终止循环,但在终止之前,已经把'\0'赋值给了*dest_ptr,然后两个指针才各自往后挪了一位。
说白了,这个循环连source里的'\0'一起复制到temp里了,自然就不用手动加了~
但如果是和下标版逻辑完全一致的指针写法,还是得加'\0'
要是你把下标循环直接改成指针版,比如这样:
char source[50] = "Hello World"; char temp[50]; char *dest_ptr = temp; char *src_ptr = source; while (*src_ptr != '\0') { *dest_ptr = *src_ptr; dest_ptr++; src_ptr++; } // 这里必须手动加!不然temp没终止符 *dest_ptr = '\0'; cout << temp;
这种写法和你的下标版逻辑一模一样,循环只复制有效字符,所以同样得手动补'\0'才行。
总结一下
- 下标版和逻辑完全等价的指针版都需要手动加'\0',因为它们只处理了非'\0'的有效字符
- 你看到的“不用加”的指针版,是利用了赋值表达式的特性,把
source里的'\0'也一起复制了,所以省了手动加的步骤
内容的提问来源于stack exchange,提问作者MarionaGlenni
相关产品推荐
相关产品推荐

