我正在编写一个ASE/RSA加密程序,目前正在处理这个接口。我目前要做的是将加密/解密的结果流到本地文件夹中,即“加密/FILE.txt”。当用户选择输入通过stdin加密的数据时,我希望使用用户输入的命令行参数作为文件名。这就需要我将文件夹路径与文件名组合起来:
ofstream out("Encrypted/FILE.txt");我目前正在使用以下代码实现这一目标:
char ddest[] = "Decrypted/";
char edest[] = "Encrypted/";
char * decf;
char * encf;
decf = ddest;
encf = edest;
...
if(enc) //If the user wants to encrypt
out.open(strcat(encf, argv[argc-2])); //resulting in "Encrypted/FILE.txt"
else
out.open(strcat(decf, argv[argc-2]));当用户希望使用命令行参数输入作为文件名而不是stdin时,我还使用相同的strcat方法将路径与文件名组合在一起。当我运行我的程序时,除了尝试从STDIN到ENCODE之外,它适用于所有情况。经过一些调试,我已经将问题缩小到了ofstream打开函数。这不是strcat的结果,如下代码所示
cout << "a" << endl;
char * path = strcat(encf, argv[argc-2]);
cout << "b" << endl;
out.open("Decrypted/test.txt");
cout << "c" << endl;结果如下所示
escher@ubuntu:~/AESencrypt$ ./ucrypt -e -s secretstdin.txt key
a
b
Segmentation fault (core dumped)问题是,程序成功地在解密文件夹中创建了文件test.txt,无论是当路径是隐式的还是在open()中使用strcat函数时。
那么,有谁能就这个问题提出建议呢?我的猜测是,我将路径和文件名组合在一起的方法很粗糙,会导致内存问题。
发布于 2013-11-20 15:49:08
不要在strcat程序中使用C++。这是很多工作,而且容易出错,因为你必须自己做内存管理。
如果您只想连接字符串,请使用以下命令:
std::string filename;
filename += "directory/";
filename += basename;
std::ofstream out(filename.c_str());如果事情变得更加复杂,请使用std::ostringstream,您可以将它连在一起,也可以连接整数和其他对象。
在特殊情况下,您创建了一个“加密/”C字符串。这个C字符串没有空间来追加某些内容。无论如何,当您尝试时,您将覆盖任意内存,从而导致未定义的行为。赋值encf = edest不创建新字符串,它只是使encf指向与edest相同的字符串。
https://stackoverflow.com/questions/20100320
复制相似问题