一道C语言字符串拷贝找错题

找出下述代码中的错误
#include 

int main() 
{
	char *src = "hello, world";
	char *dest = NULL;

	int len = strlen(src);  // 获取字符串长度,不包括`\0`
	dest = (char*)malloc(len);  // 1
	char* d = dest;
	char* s = src(len);  // 2
	while(len-- ! = 0) {
		d++ = s--;  // 3
	}
	printf("%s", dest);
	return 0;
}
正确写法
#include 
#include 
int main() 
{
	char *src = "hello, world";
	char *dest = NULL;

	int len = strlen(src);
	dest = (char*)malloc(len+1);
	char* d = dest;
	char* s = src + len - 1;
	while(len-- != 0) {
		*d++ = *s--;
	}
	printf("%s", dest);
	return 0;
}
输出结果
dlrow ,olleh
--------------------------------
Process exited after 0.1189 seconds with return value 0
请按任意键继续. . .
错误点解析
  1. C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。题中前述仅分配长度不包括\0,故在对字符型指针分配内存时,该+1
  2. 指针变量s应指向字符串(字符数组)的首地址,但从后文看,应该是指向倒数第一位有效数字,故应改为:src + len - 1
    如果想指向首地址,应写为:char* s = src
  3. 指针间赋值,应改为:*d++ = *s--

注:字符串一旦被创建就存在于常量池中。以字符数组形式创建的字符串,实际上是从字符串常量池中复制了一个副本,所以修改字符数组的内容时,只是修改的自己的副本,并不会影响到常量池中的字符串。而对字符串指针操作时会影响到常量池中的字符串

参考文档:C字符串

你可能感兴趣的:(C++)