C++传递给函数的 strcpy 指针
C++ strcpy pointers that are passed to a function
我正在将字符串或字符数组传递给函数并交换它们,但由于某种原因丢失了第一个字符数组的值。 这是我的代码:
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"并混淆程序。
任何帮助将不胜感激,这也是为什么会发生这种情况也非常有用。
因为您的字符串a
比 b
.因此,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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- strcpy 在类中无法使用字符串指针
- strcpy 对指针函数的引用
- 将 strcpy() 与指向 cstring 的指针一起使用时出现分段错误
- C++传递给函数的 strcpy 指针
- 分配指针和使用strcpy之间的区别
- 这个带有指针函数的 strcpy 有什么问题?
- strcpy char 指针中止