在 Bjarne's Book 的 C++ 练习中实现 strdup(),将 char* 复制到另一个 char* 然后打印出来什么也得不到

Implementing strdup() in c++ exercise from Bjarne's Book, copying char* to another char* then print out gets nothing

我正在使用以下书籍学习 C++:使用 C++ 的编程原理和实践 Bjarne Stroustrup
第19章练习1
实现 strdup() 函数,仅使用解引用方法(不下标)将一个 c 字符串复制到另一个字符串中。
我的复印没有打印任何东西 我已经找了好几天的答案了。
请问有人能帮帮我吗?
以下是完整代码:-

#include <iostream>
using namespace std;

char* strdup(const char* q) {
    // count the size
    int n {0};
    while(q[n]) {
        ++n;
    }
    // allocate memory
    char* p = new char[n+1];
    
    // copy q into p
    while(*q) {
        *p++ = *q++;
    }
    // terminator at the end
    p[n] = 0;
    return p;
}


int main()
{
    const char* p = "welcome";
    cout << "p:" << p << endl;

    const char* q = strdup(p);
    cout << "q:" << q << endl;
    
    // check to see if q get new address
    cout << "&p:" << &p << endl;
    cout << "&q:" << &q << endl;
    
    return 0;
}

替换为:

while(*q) {
    *p++ = *q++;
}

..用这个:

for (int i = 0; i < n; i++) {
    p[i] = q[i];
}

问题已解决。

using only de-referencing method (not subscripting)

所以这已经是错误的,因为它使用了下标运算符 []:

    // count the size
    int n {0};
    while(q[n]) {
        ++n;
    }

I just don't know how to turn the pointer back to the first char.

嗯,有两种基本方法:

  1. 首先停止损坏您的原始指针。你可以引入新的变量,记得吗?

    char* p_begin = new char[n+1];
    char* p_end = p_begin + n + 1; // copy the terminator too
    for (char *tmp = p_begin; tmp != p_end; *tmp++ = *q++) ;
    return p_begin;
    
  2. 你知道要移动多远p才能回到原来的值,因为你已经计算出字符串有多长了!

    while(*q) {
        *p++ = *q++;
    }
    *p = 0; // you already moved p and aren't supposed to be subscripting anyway
    return p - n;
    

最后,您可以使用完全相同的技术在不使用下标的情况下获得大小:您可以使用临时变量来查找终止符,或者如果您前进 q,然后减去 n 最后再从它开始。

哦,如果您在可视化所有变量的值时遇到困难 - 学习使用调试器(或只是添加大量打印语句)。你需要了解你的状态是如何随时间变化的,观察它比仅仅观察黑匣子的结果并试图猜测里面发生了什么更有帮助。