在 C++ 中将 sprintf 用于系统命令时如何修复分段错误(核心转储)错误

How to fix Segmentation Fault (core dumped) error when using sprintf for system commands in C++

我正在尝试在 C++ 中使用系统命令,我正在尝试制作一个 pinger。下面是我的脚本:

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
char ip;
char *cmd;
cout << "Input IP: ";
cin >> ip;
sprintf(cmd, "ping %s", ip);
system(cmd);
return 0;
}

代码编译并运行良好,直到您输入要 ping 的 IP,此时它给了我这个:

Input IP: 8.8.8.8
Segmentation fault (core dumped)

我怀疑它与 sprintf 有关,但我不确定,因为我是 C++ 编码的初学者

如何修复此错误?

我强烈建议在不需要时不要混合使用 C 和 C++。这意味着,使用 C++ 版本的 C headers 并且仅在需要时使用 C headers。在 C++ 中有 std::string 可以通过 +.

连接

在您的代码中,ip 是单个字符,cmd 只是一个指针。您无法使其指向一些已分配的内存。因此,尝试写入 cmd.

指向的内存时会出现运行时错误
#include <string>
#include <iostream>
#include <cstdlib>
    
int main() {
    std::string ip;
    std::cout << "Input IP: ";
    std::cin >> ip;
    std::string cmd = std::string{"ping "} + ip;
    std::system(cmd.c_str());
}

请注意,使用用户输入调用 system 存在安全风险。它允许用户执行任意命令。我强烈建议至少检查 ip 是一个有效的 ip 而不是其他东西。看这里:How do you validate that a string is a valid IPv4 address in C++?