You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:45:48