在 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++?
我正在尝试在 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++?