此代码中,字符长度突然变化。在引入char 文件之前,strlen(str)是正确的。当我介绍新的char 文件时,变量str的strlen值会发生变化。
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main(){
char buf[BUFSIZ];
if(!getcwd(buf,BUFSIZ)){
perror("ERROR!");
}
cout << buf << endl;
char *str;
str = new char[strlen(buf)];
strcpy(str,buf);
strcat(str,"/");
strcat(str,"input/abcdefghijklmnop");
cout << str << endl;
cout << strlen(str) << endl;
char *file;
file = new char[strlen(str)];
cout << strlen(file) << endl;
strcpy(file,str);
cout << file << endl;
}
答案 0 :(得分:1)
由于undefined behavior,您的代码已buffer overflow。你应该是scared。
您应该考虑使用std::string。
std::string sbuf;
{
char cwdbuf[BUFSIZ];
if (getcwd(cwdbuf, sizeof(cwdbuf))
sbuf = cwdbuf;
else {
perror("getcwd");
exit(EXIT_FAILURE);
}
}
sbuf += "/input/abcdefghijklmnop";
你应该编译所有警告&amp;调试信息(例如g++ -Wall -Wextra -g
)然后使用调试器gdb
。别忘了字符串是零字节终止的。你的str
太短了。如果你坚持要避免std::string
(你不应该使用恕我直言),你需要分配更多的空间(并记住额外的零字节)。
str = new char[strlen(buf)+sizeof("/input/abcdefghijklmnop")];
strcpy(str, buf);
strcat(str, "/input/abcdefghijklmnop");
请记住,sizeof
某些文字字符串比其长度多一个字节(由strlen
衡量)。例如sizeof("abc")
是4。
同样,您的file
变量的一个字节太短(缺少终止零字节的空间)。
file = new char[strlen(str)+1];
在GNU系统(例如Linux)上使用BTW,您可以使用asprintf(3)或strdup(3)
(并使用free
而不是delete
来释放内存)并考虑使用{{ 3}}