Windows环境下C语言实现自定义IP的ping/tracert工具开发求助
解决C语言Windows应急工具中自定义IP执行ping/tracert的问题
原代码的核心问题
#define语法错误:原写法不符合C语言宏定义规则,正确形式应为#define 标识符 值scanf输入处理漏洞:scanf("%d", &selection1)执行后会在输入缓冲区留下换行符,后续scanf("%c")会直接读取该换行符,无法获取用户输入的IP- 未初始化指针:
char* pingAdress是未分配内存的野指针,直接用scanf写入会触发内存访问错误 system函数使用错误:system不支持格式化参数传参,无法直接通过"ping %c"的形式拼接命令
修正后的完整代码
#include<stdio.h> #include<stdlib.h> #include<string.h> // 定义缓冲区大小,用于存储IP和命令字符串 #define BUFFER_SIZE 256 int main() { int selection1; char ip_address[BUFFER_SIZE] = {0}; char cmd_buffer[BUFFER_SIZE] = {0}; printf("=== Windows应急工具 ===\n"); printf("请选择问题类型,输入对应数字后回车:\n"); printf("1) 服务器/客户端无法访问\n"); printf("2) 问题2\n"); printf("3) 问题3\n"); printf("4) 问题4\n"); printf("5) 问题5\n"); printf("6) 问题6\n"); printf("7) 问题7\n"); // 读取用户选择 scanf("%d", &selection1); // 清除输入缓冲区的换行符,避免干扰后续输入 getchar(); if (selection1 == 1) { printf("请输入要检测的IP地址或域名:"); // 读取用户输入的IP/域名 fgets(ip_address, BUFFER_SIZE, stdin); // 移除fgets自动读取的换行符 ip_address[strcspn(ip_address, "\n")] = '\0'; // 拼接并执行ping命令 sprintf(cmd_buffer, "ping %s", ip_address); printf("--- ping命令执行结果 ---:\n"); system(cmd_buffer); // 拼接并执行tracert命令 sprintf(cmd_buffer, "tracert %s", ip_address); printf("\n--- tracert命令执行结果 ---:\n"); system(cmd_buffer); } else { printf("暂未实现该功能\n"); } system("pause"); return 0; }
关键改进说明
- 安全内存分配:使用固定大小的字符数组存储输入和命令,避免野指针导致的内存错误
- 输入缓冲区处理:用
getchar()清除数字输入后的换行符,用fgets读取IP确保完整获取输入,strcspn移除多余换行符 - 命令拼接:通过
sprintf将命令与IP拼接成完整字符串后,再传给system执行 - 用户体验优化:增加清晰的操作提示,分段显示命令结果,最后用
system("pause")保持窗口打开,方便查看输出
内容的提问来源于stack exchange,提问作者Sergej Wozke
相关产品推荐
相关产品推荐

