Определите, является ли строка допустимым адресом IPv4 в C

Вот пример, показывающий, как рекурсивно искать файл с именем «post.php» из каталога «/ Users / mkyong / sites» и всех его подкаталогов.

import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FileSearch {
private String fileNameToSearch;
private List<String> result = new ArrayList<String>();

public String getFileNameToSearch() {
    return fileNameToSearch;
}

public void setFileNameToSearch(String fileNameToSearch) {
    this.fileNameToSearch = fileNameToSearch;
}

public List<String> getResult() {
    return result;
}

public static void main(String[] args) {

    FileSearch fileSearch = new FileSearch();

    // try different directory and filename :)
    fileSearch.searchDirectory(new File("/Users/mkyong/websites"), "post.php");

    int count = fileSearch.getResult().size();
    if (count == 0) {
        System.out.println("\nNo result found!");
    } else {
        System.out.println("\nFound " + count + " result!\n");
        for (String matched : fileSearch.getResult()) {
            System.out.println("Found : " + matched);
        }
    }
}

public void searchDirectory(File directory, String fileNameToSearch) {
    setFileNameToSearch(fileNameToSearch);

    if (directory.isDirectory()) {
        search(directory);
    } else {
        System.out.println(directory.getAbsoluteFile() + " is not a directory!");
    }

}

private void search(File file) {
    if (file.isDirectory()) {
        System.out.println("Searching directory ... " + file.getAbsoluteFile());

        // do you have permission to read this directory?
        if (file.canRead()) {
            for (File temp : file.listFiles()) {
                if (temp.isDirectory()) {
                    search(temp);
                } else {
                    if (getFileNameToSearch().equals(temp.getName().toLowerCase())) {
                        result.add(temp.getAbsoluteFile().toString());
                    }

                }
            }

        } else {
            System.out.println(file.getAbsoluteFile() + "Permission Denied");
        }
    }

}

}
25
задан enveeed 17 July 2018 в 18:41
поделиться

6 ответов

Я задал аналогичный вопрос для C ++ . Вы должны быть в состоянии использовать слегка измененную (для C) версию того, что я придумал тогда.

bool isValidIpAddress(char *ipAddress)
{
    struct sockaddr_in sa;
    int result = inet_pton(AF_INET, ipAddress, &(sa.sin_addr));
    return result != 0;
}

Вам понадобится #include , чтобы использовать Функция inet_pton () .

Обновление на основе комментариев к вопросу: Если вы хотите узнать, содержит ли строка в стиле C IP-адрес, то вы должны объединить два ответа. дано до сих пор. Используйте регулярное выражение, чтобы найти шаблоны, которые приблизительно соответствуют IP-адресу, а затем используйте функцию выше, чтобы проверить соответствие, чтобы увидеть, является ли это реальной сделкой.

53
ответ дан 28 November 2019 в 18:19
поделиться

Я бы использовал это регулярное выражение (любезно предоставлено Примеры регулярных выражений ):

`\b(?:\d{1,3}\.){3}\d{1,3}\b`
1
ответ дан 28 November 2019 в 18:19
поделиться

Я дам решение «не хочу двух проблем»:

#include <string.h>



int isIp_v4( char* ip){
        int num;
        int flag = 1;
        int counter=0;
        char* p = strtok(ip,".");

        while (p && flag ){
                num = atoi(p);

                if (num>=0 && num<=255 && (counter++<4)){
                        flag=1;
                        p=strtok(NULL,".");

                }
                else{
                        flag=0;
                        break;
                }
        }

        return flag && (counter==3);

}

РЕДАКТИРОВАТЬ: strtok может быть не безопасным для потоков (кредиты Адаму Розенфилду)

1
ответ дан 28 November 2019 в 18:19
поделиться

Это процедура, которую я недавно написал для встраиваемой системы, которая генерирует различные подозрительные шаблоны в сети. Таким образом, он использует абсолютно никаких причудливых вещей, таких как сетевые библиотеки или даже стандартные библиотеки C, предпочитая держаться подальше от всего этого современного материала, такого как токенизация строк и (дрожь) библиотеки регулярных выражений :-) С этой целью , он подходит практически для любой среды, в которой вы можете оказаться, и он был ослепительно быстрым.

Хотя, если вы находитесь в среде, в которой есть что-то вроде checkIp4Addess () , я бы предложил Вы используете это вместо этого. Это указание на то, с чем вам иногда приходится мириться при выполнении встроенных вещей (хотя это является реальным решением).

int isValidIp4 (char *str) {
    int segs = 0;   /* Segment count. */
    int chcnt = 0;  /* Character count within segment. */
    int accum = 0;  /* Accumulator for segment. */

    /* Catch NULL pointer. */

    if (str == NULL)
        return 0;

    /* Process every character in string. */

    while (*str != '\0') {
        /* Segment changeover. */

        if (*str == '.') {
            /* Must have some digits in segment. */

            if (chcnt == 0)
                return 0;

            /* Limit number of segments. */

            if (++segs == 4)
                return 0;

            /* Reset segment values and restart loop. */

            chcnt = accum = 0;
            str++;
            continue;
        }
        /* Check numeric. */

        if ((*str < '0') || (*str > '9'))
            return 0;

        /* Accumulate and check segment. */

        if ((accum = accum * 10 + *str - '0') > 255)
            return 0;

        /* Advance other segment specific stuff and continue loop. */

        chcnt++;
        str++;
    }

    /* Check enough segments and enough characters in last segment. */

    if (segs != 3)
        return 0;

    if (chcnt == 0)
        return 0;

    /* Address okay. */

    return 1;
}
8
ответ дан 28 November 2019 в 18:19
поделиться

В url / uri rfc 3986 адрес ipv4 расширенной формы Бэкуса-Наура (ABNF) определяется следующим образом:

  IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

  dec-octet   = DIGIT                 ; 0-9
              / %x31-39 DIGIT         ; 10-99
              / "1" 2DIGIT            ; 100-199
              / "2" %x30-34 DIGIT     ; 200-249
              / "25" %x30-35          ; 250-255

Я реализовал проверку с помощью регулярного выражения в следующей форме:

// Although the RFC says ipv6 octects like 001 are not valid, it would be risky
// not to accept those
#define decoct "([01]?[0-9]?[0-9]|2[0-4][0-0]|25[0-5])"
#define ipv4 "(" decoct "\\." decoct "\\." decoct "\\." decoct ")"
0
ответ дан 28 November 2019 в 18:19
поделиться

Это моя попытка с программированием на очень низком уровне C (фактически используется в одной из моих программ для микроконтроллера PIC).Он не использует библиотеку string.h. Он не использует указатели, так как этот компилятор, который я использую, не работает с ними, в любом случае вы можете их использовать. Принимая это во внимание и предварительно определяя переменную для обработки буфера входящих данных следующим образом:

#define isdigit(x)  isamong(x,"0123456789")
char    IPACK_Buff[IPACK_SIZE]; 

// Check if string is a valid IP
int IPACK_is_valid_ip(int len)
{
    int i = 0;
    int j = 0;
    int NumDots = 0;
    char number[4] = "000\0";

    // Check first  char is numeric
    if (!isdigit(IPACK_Buff[0])) 
        return 0;

    for (i = 0 ; i< len; i++)
    {
        if (isdigit(IPACK_Buff[i]))
        {
            number[j] = IPACK_Buff[i];
            j++;
            if (j>3)    
                return 0;
        }
        else if (IPACK_Buff[i] == '.')
        {
            if (atof(number)> 255) return 0;
            memset(number, '\0', 4);

            j = 0;
            NumDots++;
            if(NumDots>3)
                return 0;
        }
    }

    if (NumDots == 3)
    {
        return 1;
    }
    else 
        return 0;
}//

Я надеюсь, что эта функция поможет вам всем. Опять же, примите во внимание низкий уровень, эта функция запрограммирована, прежде чем критиковать.

1
ответ дан 28 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: