c - C语言中如何在一个输入中获取多个字符

标签 c stdio

我是 C 编程新手,所以我正在尝试编写一段代码,我需要以十六进制获取 ip 地址,但我不知道该怎么做。据我所知,我无法使用 char 获得多个输入,但使用 int 时,当用户输入“A”时,结果会显示巨大的数字。 对于十进制输入我写了这样的东西

int main(){
    int IP_1,IP_2,IP_3,IP_4;
    printf("Enter the IP address:\n");
    scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4);

我使用了 4 个变量,因为稍后我将使用这些数字进行转换。

编辑:抱歉没有添加此内容,我无法使用十六进制 %x 或数组/字符串

最佳答案

有什么问题吗?

输入字母时的巨大值是因为 scanf() 无法将该字母识别为 int 的有效输入,并停止读取,从而使其余变量未分配。

如何解决?

首先,您应该检查是否已读取了预期的那么多变量:

if (scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4)<4) {
    printf ("Error:  invalid format !\n"); 
}

然后您可能想读取十六进制格式的整数:

scanf("%x.%x.%x.%x",&IP_1,&IP_2,&IP_3,&IP_4);

您可以使用scanf() here找到有关输入格式的更多信息。

重要说明: IPv4 地址的约定是使用点分隔小数部分。对于十六进制表示法,数字原则上是连续的,每个组成部分为 2 位数字。

编辑

如果您不允许使用%x、数组或字符串,那么您只能输入十六进制数字作为字符。假设每个十六进制部分都输入 2 位数字,则您可能需要输入 8 个字符:

char c1, c2, c3, c4, c5, c6, c7, c8; 
scanf("%c%c.%c%c.%c%c.%c%c",&c1, &c2, &c3, &c4, &c5, &c6, &c7,&c8);
// are you sure you have to enter the dots ?  

要将两个十六进制字符转换为 int,而不使用字符串和数组,您可以这样做:

if (c1>='A' && c1<='F') 
    IP_1 = c1-'A'; 
else if (c1>='0' && c1<='9') 
    IP_1 = c1-'0';
else 
    IP_1 = 0;   // OUCH! THIS IS AN ERROR

IP_1 = IP_1 *16; 
if (c2>='A' && c2<='F') 
    IP_1 = IP_1 + c2-'A'; 
else if (c2>='0' && c2<='9') 
    IP_1 = IP_1 + c2-'0';
else 
    IP_1 = 0;   // OUCH! THIS IS AGAIN AN ERROR

我让您添加小写数字的情况作为练习。我让你完成所有角色,因为你不允许创建函数。

最后一句话

在我看来,做练习迫使学生屠杀全世界公认的 IP 地址约定,然后强制学生复制粘贴代码,这显然是一个完全无能的老师的迹象。

为了您的利益,您不应该像我在这里一样透明和开放。然而,我觉得有必要警告您:去网上寻找一些不错的教程。或者购买 K&R 并完成其中包含的所有练习。您将学到真正的技能,而不是养成坏习惯。

关于c - C语言中如何在一个输入中获取多个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55201616/

相关文章:

c - 使用 fscanf() 时不理解 C 格式说明符

c - if 语句是否可以判断是否未输入某些内容?

c++ - 在C++中读取输入

c - 在 C 中存储二维数组的数组

c++ - 默认退出函数实现

c - 线程安全与可重入

c - 如何让我的词法分析器程序打印出的不仅仅是分隔符?

c - 是否可以为此使用 stdio 缓冲区?如果现在,有什么替代方案(不亲自实现)?

c++ - 删除 HWND 对象

c - MISRA C : 2004 compliant code 的 printf() 替代方案