C++传递给函数的 strcpy 指针

C++ strcpy pointers that are passed to a function

本文关键字:strcpy 指针 函数 C++      更新时间:2023-10-16

我正在将字符串或字符数组传递给函数并交换它们,但由于某种原因丢失了第一个字符数组的值。 这是我的代码:

void foo(char* a, char* b){
         char* temp;
         temp = new char[strlen(a)+1];
         strcpy(temp, a);
         strcpy(a, b);
         strcpy(b, temp);
         delete[] temp;
}

因此,在foo中,函数传递了两个指针,并尝试交换。这是主要功能。变量的传递可能有问题,但编译器没有给我问题。

int main(){
         char a[] = "First";
         char b[] = "Last";
         std::cout << "A Before: "<< a << "n";
         std::cout << "B Before: " << b << "nn";
         foo(a, b);
         std::cout << "A After: "<< a << "n";
         std::cout << "B After: "<< b << "nn";
         return 0;
}

我得到的输出如下:

A Before: first
B Before: last
A After: 
B After: first

现在我已经在 strcpy 期间在函数中测试了字符串的值,并在最后一个 strcpy 之后变为空,这意味着,或者至少我认为,问题出在指向原始变量的指针中。它可能是一种连锁反应类型,其中所有指针都指向"a"并混淆程序。

任何帮助将不胜感激,这也是为什么会发生这种情况也非常有用。

因为您的字符串ab .因此,strcpy行中无法按预期工作:

strcpy(b, temp);

技巧:

  • 使用 strncpy 而不是 strcpy
  • 使用 c++ 字符串而不是 c 样式字符串。然后你可以交换他们与a.swap(b);

问题是你的数组大小恰好让你的堆栈崩溃;幸运的是,对你来说,效果只是在 a 的第一个字符中放置一个空字节,使其成为空字符串。

#include <iostream>
#include <string.h>
void foo(char* a, char* b){
         char* temp = new char[strlen(a)+1];
         strcpy(temp, a);
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
         strcpy(a, b);
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
         strcpy(b, temp); // this copies 6 bytes to b, which puts a 0 in the first byte of a.
         std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
         delete[] temp;
}
int main() {
     char a[] = "First";
     char b[] = "Last";
     std::cout << "a size is " << sizeof(a) << std::endl;
     std::cout << "b size is " << sizeof(b) << std::endl;
     std::cout << "address of a[0] is " << (void*)&a[0] << std::endl;
     std::cout << "address of b[0] is " << (void*)&b[0] << std::endl;
     foo(a, b);
     std::cout << "A After: "<< a << "n";
     std::cout << "B After: "<< b << "nn";
}

http://ideone.com/fDvnnH

a size is 6
b size is 5
address of a[0] is 0xbfec5caa
address of b[0] is 0xbfec5ca5
temp = First a = First b = Last
temp = First a = Last b = Last
temp = First a =  b = First
A After: 
B After: First

您可能需要调查std::string或查看使用std::strncpy