如何在C(Windows)中读取IP地址?

时间:2018-03-10 13:31:04

标签: c windows

我是C编程新手并且一直在阅读它here.

我发现int数据类型可用于为数值/整数声明变量,其值范围介于-32,768 to 32,767-2,147,483,648 to 2,147,483,647之间。

虽然char数据类型可用于存储-128 to 127 or 0 to 255值。

IP地址怎么样?我已经尝试了int但是只识别了IP的第一个八位字节。

它也不适用于char

C:\Codes>more input_output.c
#include <stdio.h>

int main()
{
        int a;
        int b;
        char c;

        printf("\n1. Enter a number : ");
        scanf("%d",&a);
        printf("You've entered %d\n",a);

        printf("\n2. Enter an IP Address : ");
        scanf("%d",&b);
        printf("You've entered %d\n",b);

        printf("\n3. Enter an IP Address : ");
        scanf("%c",&c);
        printf("You've entered %d\n",c);

        return 0;
}

C:\Codes>

编译

C:\Codes>gcc input_output.c -o input_output

C:\Codes>

最终输出

C:\Codes>input_output.exe

1. Enter a number : 5
You've entered 5

2. Enter an IP Address : 8.8.8.8
You've entered 8

3. Enter an IP Address : You've entered 46

C:\Codes>

3 个答案:

答案 0 :(得分:2)

IP地址是真正的32 - 位整数,通常以字符串形式表示,如192.0.2.33。它保存在结构struct sockaddr_in中。

最好的方法是使用专门的函数inet_pton将您的字符串转换为IP地址并通过inet_ntop

将其恢复
#include <stdio.h>

#ifdef _WIN32
 #include <winsock2.h>
#else
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <netinet/ip.h>
#endif

int main (void) 
{
   int parts[4];

   struct sockaddr_in sa;
   char str[64]; 

   // naive approach:
   printf ("\n Enter 4 IP Address parts : \n");

   scanf ("%d", &parts[3]);
   scanf ("%d", &parts[2]);
   scanf ("%d", &parts[1]);
   scanf ("%d", &parts[0]);

   printf ("%d.%d.%d.%d\n", parts[3], parts[2], parts[1], parts[0]);

   // The best:
   printf ("\n Enter IP Address in a format: 192.0.2.33 :\n");
   scanf ("%s", str);

   // store this IP address in sa:
   inet_pton(AF_INET, str, &(sa.sin_addr));

   // now get it back and print it
   inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN);

   printf("%s\n", str); 

   return 0;
} 

输出:

 Enter 4 IP Address parts :                                                                                                                   
190                                                                                                                                           
0                                                                                                                                             
2                                                                                                                                             
33                                                                                                                                            
190.0.2.33                                                                                                                                    

 Enter IP Address in a format: 192.0.2.33 :                                                                                                   
190.0.5.22                                                                                                                                    
190.0.5.22      

答案 1 :(得分:1)

扫描号码时

scanf("%d",&b);停止(停止/不读取以下点字符),但您输入了8.8.8.8

下次扫描char时,您获得.的代码(的ASCII为46

本Q&amp; A中描述了一种读取IP地址的正确方法:IP address input in C

答案 2 :(得分:1)

你学过琴弦了吗?这些基本上是很多字符。你可以用C语言写这样的东西。

const char* ip = "127.0.0.1"

或使用scanf

阅读
char ip[256];
scanf("%s", ip);

char ip[256]定义了一个char数组。然后下一行scanf("%s", ip);读取从键盘输入的任何内容到char数组。

仅仅因为ip地址中包含数字,这并不意味着你应该使用int来存储。 IP地址更像是电话号码。算术对它们没有意义。