如何在C中的一个输入中获取多个字符

how to get multiple character in one input in C

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

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 或 arrays/strings

有什么问题吗?

输入字母时的巨大值是因为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 ?  

要在不使用字符串和数组的情况下将两个十六进制字符转换为一个整数,您可以这样做:

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 并进行其中包含的所有练习。你会学到真本领,而不是养成坏习惯。

我认为最好的方法是读取一个字符串,然后使用已经存在的函数将字符串转换为IP(即inet_aton())。 另外,我会避免 scanf 用于字符串,这是不安全的。

有关现场演示和代码,请参阅 https://ideone.com/aO9Nll

#include <stdio.h>

int main()
{        
    unsigned int IP_1,IP_2,IP_3,IP_4; 

    printf("Enter the IP address:\n");
    scanf("%x %x %x %x",&IP_1,&IP_2,&IP_3,&IP_4); //storing in Hex format

    printf("%x %x %x %x",IP_1,IP_2,IP_3,IP_4); 
}