2013-04-19 3 views
0

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

#include <stdlib.h> 
#include <stdio.h> 
#include <regex.h> 
#include <sys/types.h> 

int main (int argc, char * argv []) { 
    regex_t regex; 
    int ret; 
    char * reg = "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$"; 

    ret = regcomp(& regex, reg, REG_NEWLINE | REG_EXTENDED); 
    if (ret) { 
      printf("no compile\n"); 
    } else { 
      printf("compile\n"); 
    } 

    char ips [17]; 
    fgets(ips, 17, stdin); 

    ret = regexec(& regex, ips, 0, NULL, 0); 

    if (! ret) { 
      printf("match\n"); 
    } else { 
      printf("no match\n"); 
    } 

    return 0; 
} 

Когда я типа в «1111111» и нажать кнопку ввода, он печатает «у». Это не кажется правильным.

$ [name of compiled file] 
comp 
11111111 
y 
$ 

Он также соответствует более длинным строкам; Я не прошел мимо десяти.

+2

Как вы считаете, обратная косая черта в строке C? –

ответ

2

У вас ускользающей проблема:

"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$" 

На данный момент вы убегаете вашу точку один раз, что делает их точки (регулярное выражение точек вида). Кроме того, вам не нужно избегать фигурных скобок.

+0

Вы все еще пропустили экранирование первого '.' – nhahtdh

+0

@nhahtdh aha true :). Благодарю. – Loamhoof

Смежные вопросы