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

问题描述 投票:0回答:3

我是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或数组/字符串

c stdio
3个回答
0
投票

What's the problem ?

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

Edit

如果你不允许使用%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

我让练习为你添加数字为小写的情况。我让你完成所有角色,因为你不能创建功能。

FInal remark

提供强制学生屠杀全球公认的IP地址惯例的练习,然后强迫学生复制粘贴代码,这似乎是一个完全无能的老师的明显迹象。

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


0
投票

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

请参阅https://ideone.com/aO9Nll获取实时演示和代码。


0
投票
#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); 

}

© www.soinside.com 2019 - 2024. All rights reserved.