c - 如何使用 fscanf 扫描 IP 地址

标签 c ip scanf

如何在c中用scanf扫描IP地址?

我已经使用过:

scanf("%d ", &ip_address)

我应该使用

%d.%d.%d

或者有更简单的方法。

这是我从文件中读取信息的函数:

void read_tree_from(FILE *in, PC **root){
    char name[MAX_NAME];
    int ip_adress;
    int speed;
    while(fscanf(in, "%s %d %d", name, &ip_adress, &speed) != EOF){
        PC *new = create_new_item(name, ip_adress, speed);
        add_to_tree(new, root);
    }
}

但是当我运行这个程序时它工作正常但是在输出文件中它一团糟...

最佳答案

您可以使用格式说明符 %hhu.%hhu.%hhu.%hhu,它读入无符号的 8 位值,您可以直接读入 int 表示的 4 个字节一个 ip 地址,分别为:

int main () {

    const char* testLine = "aName 192.168.112.54 100";

    char name[100];
    int speed;

    volatile uint32_t ipAddress=0;
    unsigned char* ipAddressBytes = (unsigned char*)&ipAddress;


    if (sscanf(testLine, "%s %hhu.%hhu.%hhu.%hhu %d", name, ipAddressBytes+3, ipAddressBytes+2,ipAddressBytes+1,ipAddressBytes+0, &speed) == 6) {
        printf("%s %08X %d\n",name, ipAddress, speed);
    }

    return 0;   
}

输出:

aName C0A87036 100

格式%hhu读入一个整数值,映射到8位;因此,它不会检查有关 IP 地址的输入是否有效,因为 1025.168.112.54 将无效。但是,它避免了技术溢出,因为任何超过 8 位的部分都将被忽略。所以之前提到的输入会产生 01A87036

注意 volatile 说明符,它告诉编译器它不应优化对此变量的访问;否则,编译器可能会假设 - 由于值没有明显改变 - 变量未更改/未初始化。

请进一步注意,您必须注意您的环境是大端架构还是小端架构。

希望对您有所帮助。

关于c - 如何使用 fscanf 扫描 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196658/

相关文章:

你能解释这个 switch() 和等价的 for() 之间的区别吗?

C - 将数字列表与数组进行比较

Android连接服务器ip和端口

c - 为什么我的程序在使用 scanf 后暂停?

c - 32b x86 程序集 scanf 用法

c - 使用 gethostbyname 的 DNS

c - 32位单元C编程语言的范围

c - 发送带有修改报头的 TCP 段

linux - WSO2 CEP thrift ip地址未绑定(bind)到linux机器的eth0/sitelocal ip地址

c - 如何使用 fscanf() 格式化字符串