C++ 我的c字符串复制函数正在破坏其他变量的堆栈

C++ 我的c字符串复制函数正在破坏其他变量的堆栈,c++,C++,此函数在另一个程序中运行良好,但在某些情况下,它会导致运行时错误,即某个变量(有时甚至没有发送到函数中的变量)周围的堆栈已损坏 char *strCpy(char *dest, const char *source) { // copy cstring char *origin = dest; // non iterated address while (*source || *dest) { *de

此函数在另一个程序中运行良好,但在某些情况下,它会导致运行时错误,即某个变量(有时甚至没有发送到函数中的变量)周围的堆栈已损坏

char *strCpy(char *dest, const char *source) {      // copy cstring
    char *origin = dest;                            // non iterated address
    while (*source || *dest) {
        *dest = *source;
        dest++;
        source++;
    }
    return origin;
}
该职能的实施:

int main() {
    std::cout << "Will it crash?\n";
    char temp[255];
    char b[255];
    std::cin >> temp;
    strCpy(b, temp);
    std::cout << b;
    std::cout << "end\n";
    return 0;
}
intmain(){
标准:温度>温度;
strCpy(b,temp);

std::cout您的循环逻辑条件有缺陷,将导致错误

目标的内容未初始化,因此不确定。在您的条件下,根本不应检查目标,仅检查源:

while (*source) { ... }
当然,您需要将终止符添加到目标。这可以在循环之后简单地完成

*dest = '\0';

循环中的逻辑条件有缺陷,将导致错误

目标的内容未初始化,因此不确定。在您的条件下,根本不应检查目标,仅检查源:

while (*source) { ... }
当然,您需要将终止符添加到目标。这可以在循环之后简单地完成

*dest = '\0';


你不允许在strcpy中读取
dest
,只允许对它进行写入(并祈祷它足够大)在你的while循环中,去掉
|*dest
。不允许对数组进行索引?这是什么世界?@drescherjm如果我去掉
|*dest
,那么在被副本覆盖之前dest的长度比cstring的后半部分短。例如,在
strCpy(“wxyz”,“abc”)中
,wxyz将成为abcz而不是所需的abc。您还需要将
\0
复制到
dest
的末尾。您不允许在strcpy中读取
dest
,只允许写入它(并祈祷它足够大)在你的while循环中,去掉
|*dest
。不允许对数组进行索引?这是什么世界?@drescherjm如果我去掉
|*dest
,那么在被副本覆盖之前dest的长度比cstring的后半部分短。例如,在
strCpy(“wxyz”,“abc”)中
,wxyz将成为abcz而不是所需的abc。您还需要将
\0
复制到
dest
的末尾。您还应该提到
strncopy
,只是为了完整性,以及为了让来这里复制此复制功能的人。元复制:我想这解释了为什么它在我的其他程序中工作,目标是alw调用strCpy
之前定义的日期来覆盖它。我现在回到我编写的旧程序中,它们现在也破坏了堆栈。这些程序以前功能齐全,我不知道怎么会发生这种情况。即使是具有完全不同strCpy功能的版本也会导致相同的错误。还有其他人能够回复吗ate this?这是UB=未定义行为的最佳状态。它可能会工作,可能会失败,可能会再次工作…只要修复它。删除
||*dest
并没有停止错误,现在当它工作时,它停止对dest的其余部分进行写入,在从较小的单词复制时留下单词的后半部分。您还应该提到
strncopy
,只是为了完整性和人们来这里复制这个复制函数。元复制:我想这就解释了为什么它在我的另一个程序中工作,在调用strCpy覆盖它之前总是定义了目标。我现在回到我编写的旧程序,它们现在也在破坏堆栈。这些程序是e在完全功能之前,我不确定这是如何发生的。即使是具有完全不同strCpy功能的版本也会导致相同的错误。是否有其他人能够复制此错误?这是UB=未定义的行为处于最佳状态。它可能会工作,可能会失败,可能会再次工作…只需修复它。删除
| |*dest
不会停止错误,并且现在,当它工作时,它停止在dest的其余部分上写入,在从较小的单词复制时留下单词的后半部分。