segmentation-fault - ofstream open() 上的段错误

标签 segmentation-fault ofstream strcat

我正在编写一个 ASE/RSA 加密程序,目前正在接口(interface)上工作。我目前正在尝试做的是将加密/解密的结果输出到本地文件夹,即“Encrypted/FILE.txt”。当用户选择通过标准输入输入他们想要加密的数据时,我想使用用户输入的命令行参数作为文件名。这需要我将文件夹路径与文件名结合起来:

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]));

当用户希望使用命令行参数输入而不是标准输入作为文件名时,我也使用相同的 strcat 方法将路径与文件名组合起来。 当我运行我的程序时,它适用于除尝试从 STDIN 进行编码之外的所有情况。经过一番调试后,我将问题范围缩小到了 ofstream open 函数。而且它不是 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)

最关键的是,当路径是隐式的以及在 open() 中使用 strcat 函数时,程序都在 Decrypted 文件夹中成功创建了文件 test.txt。

那么,有人可以就这个问题提出建议吗?我的猜测是,我组合路径和文件名的方法很粗糙,并且导致了内存问题。

最佳答案

不要在 C++ 程序中使用 strcat。这是一项繁重的工作,而且很容易出错,因为您必须自己进行内存管理。

如果您只想连接字符串,请使用:

std::string filename;
filename += "directory/";
filename += basename;

std::ofstream out(filename.c_str());

如果事情变得更复杂,请使用 std::ostringstream,您还可以连接整数和其他对象。

在您的特殊情况下,您创建了一个 C 字符串“Encrypted/”。该 C 字符串没有空间可以追加内容。当您无论如何尝试时,您都会覆盖任意内存,从而导致未定义的行为。赋值 encf = edest 不会创建新字符串,它只是使 encf 指向与 edest相同 的字符串.

关于segmentation-fault - ofstream open() 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100320/

相关文章:

C - ptrace 和 waitpid 的段错误

c++ - 来自 Pharo Smalltalk 的 ffi 调用的段错误

c++ - 传递 std::ofstream 作为参数时,为什么我要生成 "use of deleted"函数?

c++ - 为什么我不能在同一个代码行中创建和打开一个 ofstream?

c - 将指针传递给 strcat 不会更新字符串

python - 在执行 Python 脚本时替换 Python 扩展模块时出现问题

键和文件的 C++ 映射不起作用

c - 一项任务要求我用 2 个 scanf 收集一个名字

c - 带有两个 0x00 字节前缀的 unsigned char 指针数组

c - C 中的二维动态数组分配和按引用传递