gpt4 book ai didi

c++ - 简单命令行程序中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:53 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的程序,该程序在作为命令参数输入的文件位置上使用 system() 调用 cat。但是我每次调用文件时都会遇到段错误(核心转储)。你能检查一下原因吗(我在我的程序中的任何地方都看不到我正在用内存做一些事情来得到这个错误!)。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("usage: %s filename", argv[0]);
}
else
{
printf("commad: %s", strcat("cat ", argv[1]));
system(strcat("cat ", argv[1]));
}
return 0;
}

最佳答案

你不能修改字符串字面量,例如"cat " 当你的可执行文件被加载时,它们通常存储在内存中的只读段中,当你试图修改它时,你会得到您要求解释的段错误。

考虑使用 std::string,这是更惯用的 C++ 方式:

#include <stdlib.h>
#include <stdio.h>

#include <string>

int main(int argc, char *argv[]) {
if(argc != 2) {
printf("usage: %s filename", argv[0]);
return 0;
} else {
std::string command("cat ");
command += argv[1];
printf("command: %s", command.c_str());
return system(command.c_str());
}
}

std::string 对象将根据需要动态分配内存,以容纳您添加的额外字符。但是,如果您希望继续使用 C 字符串,则需要显式管理字符缓冲区:

char *buffer = static_cast<char*>(malloc(5 + strlen(argv[1])));
strcpy(buffer, "cat ");
strcat(buffer, argv[1]);
printf("command: %s", buffer);
// ...
free(buffer);

关于c++ - 简单命令行程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22096693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com