如何在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/