Получение неправильного IP в C - PullRequest
0 голосов
/ 07 июля 2019

Я пишу программу на C, чтобы найти класс IP-адреса. Проблема с кодом заключается в том, что он не отображает правильный IP-адрес, из-за чего не отображается соответствующий класс.

На выходе отображаются отрицательные значения, которые являются неправильными.

Код компилируется без каких-либо предупреждений или ошибок.

Вот мой код.

#include <stdio.h>
#include <string.h>

void extractIpAddress(unsigned char *sourceString,short *ipAddress)
{
     short len=0;
     char  oct[4]={0},cnt=0,cnt1=0,i,buf[5];

     len=strlen(sourceString);
     for(i=0;i<len;i++)
     {
          if(sourceString[i]!='.'){
          buf[cnt++] =sourceString[i];
     }
    if(sourceString[i]=='.' || i==len-1){
        buf[cnt]='\0';
        cnt=0;
        oct[cnt1++]=atoi(buf);
    }
}
ipAddress[0]=oct[0];
ipAddress[1]=oct[1];
ipAddress[2]=oct[2];
ipAddress[3]=oct[3];
}

int main()
{
     unsigned char ip[20]={0};
     short ipAddress[4];

     printf("Enter IP Address (xxx.xxx.xxx.xxx format): ");
     scanf("%s",ip);

     extractIpAddress(ip,&ipAddress[0]);

     printf("\nIp Address: %03d. %03d. %03d. 
     %03d\n",ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]);

if(ipAddress[0]>=0 && ipAddress[0]<=127)
    printf("Class A Ip Address.\n");
if(ipAddress[0]>127 && ipAddress[0]<191)
    printf("Class B Ip Address.\n");
if(ipAddress[0]>191 && ipAddress[0]<224)
    printf("Class C Ip Address.\n");
if(ipAddress[0]>224 && ipAddress[0]<=239)
    printf("Class D Ip Address.\n");
if(ipAddress[0]>239)
    printf("Class E Ip Address.\n");

return 0;
}

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Альтернативный подход. Принесите правильные типы данных и правильные функции для сканирования и сохранения этих значений. Пример использования sscanf ниже описывает то, что я имею в виду.

  • Исходная строка должна быть нативной char типов
  • Начальная scanf должна быть ограничена по длине. Еще лучше, используйте fgets
  • Результат scanf должен быть проверен перед погружением в извлечение октетов.
  • Целевые октеты должны быть unsigned char
  • Используйте sscanf, проверяя результат, чтобы прочитать октеты
  • Используйте %hhu в качестве спецификатора формата извлечения октетов. См. спецификаторы формата для получения дополнительной информации о тех, которые вы, возможно, не знаете, существуют или оказываются полезными.

Результат выглядит так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int extractIpAddress(const char *sourceString, unsigned char *ip)
{
    return sscanf(sourceString, "%hhu.%hhu.%hhu.%hhu", ip, ip+1, ip+2, ip+3) == 4;
}

int main()
{
    char ip[20]={0};
    unsigned char ipAddress[4];
    int result = EXIT_FAILURE;

    printf("Enter IP Address (xxx.xxx.xxx.xxx format): ");
    if (scanf("%19s", ip) == 1 && extractIpAddress(ip, ipAddress))
    {
        printf("\nIp Address: %hhu.%hhu.%hhu.%hhu\n",
               ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]);

        if(ipAddress[0]>=0 && ipAddress[0]<=127)
            printf("Class A Ip Address.\n");

        else if (ipAddress[0]>127 && ipAddress[0]<191)
            printf("Class B Ip Address.\n");

        else if (ipAddress[0]>191 && ipAddress[0]<224)
            printf("Class C Ip Address.\n");

        else if(ipAddress[0]>224 && ipAddress[0]<=239)
            printf("Class D Ip Address.\n");

        else
            printf("Class E Ip Address.\n");

        result = EXIT_SUCCESS;
    }

    return result;
}
0 голосов
/ 07 июля 2019

Я запустил твой код.Проблема In the output negative values are being showed which are wrong. может быть решена простым изменением short len=0; на unsigned short len=0; и char oct[4]={0},cnt=0,cnt1=0,i,buf[5]; на unsigned char oct[4]={0},cnt=0,cnt1=0,i,buf[5];.

Тип переменной int без знака может содержать ноль и положительные числа, а int со знаком содержит отрицательные, нулевые и положительные числа.

В 32-разрядных целых числах целое число без знака имеет диапазонОт 0 до 232-1 = от 0 до 4 294 967 295 или около 4 млрд.Подписанная версия идет от -231-1 до 231, то есть от -2,147,483,648 до 2,147,483,647 или от -2 миллиардов до +2 миллиардов.Диапазон такой же, но он сдвинут на числовой линии.

В случае символов, которые составляют всего 1 байт, диапазон беззнакового символа составляет от 0 до 256, а диапазон знакового символа от -127 до 127.

void extractIpAddress(unsigned char *sourceString,short *ipAddress) функция должна выглядеть примерно так:

void extractIpAddress(unsigned char *sourceString,short *ipAddress)
 {
       unsigned short len=0;
       unsigned char  oct[4]={0},cnt=0,cnt1=0,i,buf[5];

       len=strlen(sourceString);
       for(i=0;i<len;i++)
       {
            if(sourceString[i]!='.'){
                buf[cnt++] =sourceString[i];
            }
            if(sourceString[i]=='.' || i==len-1){
                buf[cnt]='\0';
                cnt=0;
                oct[cnt1++]=atoi(buf);
       }
}

После изменения вышеуказанной переменной на правильный тип программа работает отлично и выдает правильный желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...