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的其余部分上写入,在从较小的单词复制时留下单词的后半部分。