【发布时间】:2019-12-25 18:52:43
【问题描述】:
我想编写一个代码来检查 MAC 地址的正确性。
输入应该看起来像这样D7:6E:F4:30:17:2B。
我正在考虑使用函数isdigit() 和isupper()。不知道如何让用户可以写“:”符号并阻止他写其他符号。
if(user input is 13:4F:60:AC:7O:DE)
... all good
if(user input is 14:a]:!o:0L)
... wrong input, retry
编辑 根据@Woodrow Barlow 的回答,我写了这段代码:
int mac_address()
{
int is_valid = 1;
printf("MAC ADDRESS:");
fgets(mac_addr, sizeof(mac_addr), stdin);
if (mac_addr[sizeof(mac_addr) - 1] != '\0')
{
is_valid = 0;
}
else if (ether_aton(mac_addr) == NULL)
{
is_valid = 0;
// input isn't recognizable as a MAC address
}
if (is_valid == 1)
{
system("clear");
printf("valid!\n");
printf("%s\n", mac_addr);
return license_menu();
}
else {
printf("invalid!\n");
fflush(stdin);
return 1;
}
}
【问题讨论】:
-
我不清楚你在问什么,或者你的问题是什么。您可以通过将
':'与':'进行比较来检查:是否为:。此外,ASCII 是一种文本编码。您可能已经在使用它了。 -
ispunct检查您不感兴趣的许多其他内容。您应该使用isxdigit(ch) || ch==':'。 -
Y4组件对于一个十六进制字符串来说很奇怪。 -
if (sscanf(s, "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) { /* error*/ } -
@Matt
%x接受的 syntax 被定义为strtoul接受的以 16 为基数的语法,但 C 标准实际上从未说过转换是由strtoul执行,7.21.6.2p10 表示“如果转换的结果不能在 [destination] 对象中表示,则行为未定义。”我能看到的对该句子的唯一可行解释是,对于strto*会报告溢出的任何输入,相应的scanf说明符具有未定义的行为。