为什么以下程序不会两次打印相同的字符串?

时间:2014-09-07 00:38:09

标签: c

我无法弄清楚为什么不能两次打印相同的字符串。 这是示例代码

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;
}

3 个答案:

答案 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-incrementassignment打包到while test clause后跟empty line,而是通过实际使用while下方的行来使您的代码更具可读性适用于post-incrementassignment。您还必须注意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