【问题标题】:C++ copying char* using pointersC++ 使用指针复制 char*
【发布时间】:2018-05-05 13:22:23
【问题描述】:

我正在尝试掌握指针,我有这个简单的代码需要解释一下。

我需要将一个 char 数组复制到另一个。在我的主要功能中,我有以下代码:

const int MAX_SIZE = 100;

char x[MAX_SIZE] = "1234565";
char* y = new char[MAX_SIZE];

copyArray(x, y);    
std::cout << y;

delete [] y;

现在问题来了,这段代码如何(工作得很好):

while ((*dest = *source) != '\0')
{
    dest += 1;
    source += 1;
}

与此不同(最后给出奇怪的字符):

while (*source != '\0')
{
    *dest = *source;

    dest += 1;
    source += 1;
}

看起来这两个功能非常相似。 在我们到达源字符串中的空终止符之前,我们一直在复制是有道理的,对吧(第二个函数)?

但它不能正常工作 - 我在复制数组的末尾得到了一些奇怪的字符。但是,第一个函数运行良好。

void copyArray(const char* source, char* dest);

【问题讨论】:

  • 对,我做了两次建议的标签,对不起
  • while ((*dest = *source) != '\0') 保证必要的终止 '\0' 字符将在循环结束之前被复制。另见idownvotedbecau.se/nodebugging
  • 你的意思是在第二个例子中它会在遇到'\0'时中断循环,这意味着它不会终止字符串?
  • 是的,我就是这个意思。
  • @daavid245 详细信息:while (*source != '\0') 循环不会“不会终止字符串”。它不会终止字符数组。一个字符数组在它有一个空字符之前不是一个字符串。

标签: c++ arrays pointers char


【解决方案1】:

(*dest = *source) 是一个评估表达式,就像int i = 1+1; 的 1+1 部分一样,所以在评估之后,该值可以在其他表达式中使用

区别在于((*dest = *source) != '\0')中,*source的值被赋值给*dest,然后整个表达式被求值(表达式与*source的值相同)而*source指向的值只有用于评估 *source != '\0',但在评估该语句期间从未分配。


编辑

user0042 带来了一个非常敏锐的观察:通过这样做,以下代码

while ((*dest = *source) != '\0')
{
    dest += 1;
    source += 1;
}

确保数组的最后一个字符的值为'\0'

【讨论】:

    【解决方案2】:

    在示例中,您递增x, y 的地址,因此直到它们指向空终止符的最后一个字符,因此您必须声明一个临时变量来保存第一个地址:

    char* x = "1234565";
    char* y = new char[MAX_SIZE];
    
    // Temporary pointers to hold the first element's address
    char* tmp1 = x;
    char* tmp2 = y;
    
    while( (*y = *x) != '\0'){
        x += 1; // X no longer points to the first element
        y += 1; // Y no longer points to the first element
    }
    
    std::cout << tmp2;
    
    • 您可以使用do while 循环代替while

      char* x = "1234565";
      const int size = strlen(x);
      char* y = new char[size];
      
      char* tmp1 = x;
      char* tmp2 = y;
      
      do{
          *y = *x;
          x += 1;
          y += 1;
      }while( *(x - 1) != '\0');
      
      // Now no need for adding a null-terminator it is already added in the loop
      //  tmp2[size] = '\0';
      
      std::cout << tmp2;
      

    因为在递增之前分配值,所以最后一个字符 \0 将在添加到目标指针 y 之前中断循环。因此,我没有在n = '\0' 上而是在n - 1 = '\0' 上进行循环中断,以确保将其添加到y

    【讨论】:

    • 他在两个例子中都增加了xy
    【解决方案3】:

    形式

    while ((*dest = *source) != '\0')
    {
        dest += 1;
        source += 1;
    }
    

    保证在测试条件之前应用要复制的字符 ((*dest = *source)) 的分配,如果到达终止 '\0' 字符被评估为 false

    第二个版本不复制终止符'\0',因为循环在

    之前结束
    *dest = *source;
    

    statement is ever达到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2013-05-21
      • 2013-05-15
      • 2021-11-26
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多