当你去删除指针时,第一个例子不起作用.当我添加null终止符时,程序要么挂起,要么没有它我得到:
Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 来自Visual Studio 2008
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
Run Code Online (Sandbox Code Playgroud)
那么当我使用双引号而不是strcpy时会发生什么?它们都会完美地完成字符串,调试器不会显示任何不同的内容.
在C中,我习惯于strcpy制作一个字符串的深层副本,但在C++中使用它还是"很好"strcpy还是有更好的替代方法,我应该使用它?
memmove/memcpy/strcpy原型中的第二个arg是类似的:例如:
void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
Run Code Online (Sandbox Code Playgroud)
但显然,如果dest和src重叠,那么src的内容会被改变,违反const void/char*?
是否需要释放使用' strcpy ' 创建的字符串?以及如何释放它?
编辑:目的地分配如下:
char* buffer[LEN];
Run Code Online (Sandbox Code Playgroud) 我很困惑为什么以下不起作用:
char * f = "abcdef";
strcpy(f, "abcdef");
printf("%s",f);
char s[] = "ddd";
strcpy(&s[0], "eee");
printf("%s", s);
Run Code Online (Sandbox Code Playgroud)
在这两个例子中,strcpy收到了一个char*但是在第一个例子中它死了一个可怕的死亡.
我有一个C++ 11项目,我添加了一些strcpy_s方法调用.这适用于Windows,但在gcc上编译时,会出现错误,指出strcpy_s找不到符号.
我确实加了这条线
#define __STDC_WANT_LIB_EXT1__ 1
对代码,无济于事.
在以下程序中,我打算通过将char* line内容从一个对象复制到另一个对象strcpy。但是,当程序结束时,析构函数obj2可以正常工作,但会obj导致崩溃。gdb显示line两个对象的不同地址。
class MyClass {
public:
char *line;
MyClass() {
line = 0;
}
MyClass(const char *s) {
line = new char[strlen(s)+1];
strcpy(line, s);
}
~MyClass() {
delete[] line;
line = 0;
}
MyClass &operator=(const MyClass &other) {
delete[] line;
line = new char[other.len()+1];
strcpy(line, other.line);
return *this;
}
int len(void) const {return strlen(line);}
};
int main() {
MyClass obj("obj");
MyClass obj2 = obj;
Run Code Online (Sandbox Code Playgroud) 我正在使用只包含char [32]的结构写入二进制文件.我基本上需要通过对字符串数组执行各种计算并连接结果来格式化每个数据块.我试图将std :: string复制到没有空终止的char数组.我读到的越多,我就越困惑.如果我做:
struct block{
char data[32];
};
block blocks[2048];
std::string buffer;
buffer = "12345678123456781234567812345678";
strcpy(blocks[0].data, buffer.c_str());
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,因为使用c_str()添加空终止符使字符串长度为33.如果我从字符串中减去一个字符,它可以工作,但后来我有空终结符,我不想要.我可以成功地做到以下几点:
strcpy(blocks[0].data, "12345678123456781234567812345678");
Run Code Online (Sandbox Code Playgroud)
但我想先构造字符串,因为它通常涉及连接各种数组的不同字符串.例如,我可以用std :: string来做到这一点:
std::string buffer = stringArray1[0] + stringArray2[0];
strcpy(blocks[0].data, buffer.c_str());
Run Code Online (Sandbox Code Playgroud)
但后来我再次使用null终止符.我只想复制std :: string中的字符而没有空终止符.
我使用的是VC++ 6.0.
我想将一个以null结尾的字符串复制到另一个位置,并想知道复制的字符串有多长.效率至关重要.有一个strcpy功能可以实现这一点,但它不会返回实际复制的字符数.
当然,我可以通过简单地调用strlen后来检测复制字符串的长度来找到它,但这意味着第二次再次遍历字符串中的字符,尽管strcpy必须跟踪它复制的字符数.出于性能原因,我不想进行这样的第二次遍历.
我知道strcpy使用简单的char-by-char副本编写自己很容易,但我认为标准库可能会应用魔法,这strcpy比使用简单的char-by-char实现更快.
那么,在strcpy没有再次遍历字符串的情况下,获取复制字符数的最佳方法是什么?
背景:我有一个模仿的小例程,fgets(character, 2, fp)除了它从字符串而不是流中获取字符.newBuff是动态分配的字符串,作为参数传递,字符声明为char character[2].
常规:
character[0] = newBuff[0];
character[1] = '\0';
strcpy(newBuff, newBuff+1);
Run Code Online (Sandbox Code Playgroud)
strcpy在从中读取每个字符时复制信息丢失.
问题:Valgrind确实警告我这个活动,"源和目标重叠在strcpy(0x419b818,0x419b819)".
我应该担心这个警告吗?