我无法弄清楚为什么不能两次打印相同的字符串。 这是示例代码
int main(void)
{
char *source = "duplicate message";
char *p1,*p2,destination[50];
p1 = source;
puts(p1);
p2=destination;
while(*p2++ =*p1++)
;
puts(p2);
return 0;
}
答案 0 :(得分:2)
在周期结束时,您的p2
指向destination
字符串的末尾。那时destination
确实包含source
的副本。但是您的p2
并未指向destination
的开头。它指向存储在destination
中的复制字符串的结尾。即p2
指向空字符串。这就是你的第二个puts
打印 - 一个空字符串。
如果您要打印destination
字符串,那就是您应该在代码中编写的内容 - puts(destination)
。你为什么决定把它表达为puts(p2)
?
如果您想尝试一下,可以让p2
在周期后指向destination
中的不同位置。如果您指向destination
的开头,puts (p2)
将打印整个destination
字符串。如果您将其指向destination
字符串的中间位置,那么puts (p2)
将打印类似"ate message"
的内容,依此类推。
答案 1 :(得分:0)
此代码可能对您有所帮助:
char *my_strcpy(char dest[], const char source[])
{
int i = 0;
while (source[i] != '\0')
{
dest[i] = source[i];
i++;
}
dest[i] = '\0';
return(dest);
}
注意源的const
,表示该函数无论如何都不能更改源字符串。
答案 2 :(得分:0)
另一个警告。不是将post-increment
和assignment
打包到while test clause
后跟empty line
,而是通过实际使用while
下方的行来使您的代码更具可读性适用于post-increment
和assignment
。您还必须注意null-terminate
所有字符串。当你学习指针时,通常只需取出铅笔和纸,画出你的字符串表示,然后用手跟踪循环逻辑来确认循环是否完成了你所需的一切:
#include <stdio.h>
int main(void)
{
char *source = "duplicate message";
char *p1,*p2,destination[50];
p1 = source;
puts(p1);
p2=destination;
while (*p1) /* to walk down string, *p evaluates true until '\0' */
*p2++ = *p1++; /* dereference pointer, assign, post-increment */
p2++; /* increment pointer to next memory location */
*p2 = 0; /* null-terminate the string */
p2 = destination; /* reset pointer to beginning of destination */
puts (p2);
return 0;
}
<强>输出:强>
$./bin/dest
duplicate message
duplicate message