Строка фильтра в C - PullRequest
       12

Строка фильтра в C

1 голос
/ 11 марта 2010

Как мне отфильтровать строку в c? Я хочу удалить все, что не [a-z0-9_].

int main(int argc, char ** argv) {
   char* name = argv[1];
   // remove anything that isn't [a-z0-9_]

   printf("%s", name);
}

Ответы [ 6 ]

1 голос
/ 11 марта 2010

Если вы просто хотите убрать эти нежелательные символы из первого аргумента, вам не нужно выделять память, просто пройдитесь по вводимой строке посимвольно. И, если вы знаете, что будете работать в среде ASCII (или в любой другой, которая поддерживает смежные a - z), вы можете даже заменить вызовы функций более быстрыми версиями, проверяющими диапазоны символов.

Но я не вижу увеличения скорости как достаточного для оправдания непереносимого кода.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char ** argv) {
    int i;
    char *p;
    if (argc > 1) {
        for (p = argv[1]; *p != '\0'; p++) {
           if (islower(*p) || isdigit(*p) || *p == '_') {
               putchar (*p);
           }
        }
        putchar ('\n');
    }
    return 0;
}
1 голос
/ 11 марта 2010
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char ** argv)
{    
    char *name, *inp, *outp;

    if (argc < 2)
    {
        fprintf(stderr, "Insufficient arguments.\n");
        return 1;
    }

    inp = argv[1];
    name = malloc(strlen(inp) + 1);
    outp = name;

    if (!name)
    {
        fprintf(stderr, "Out of memory.\n");
        return 2;
    }

    while (*inp)
    {
        if (islower((unsigned char)*inp) || isdigit((unsigned char)*inp) || *inp == '_')
            *outp++ = *inp;
        inp++;
    }

    *outp = '\0';

    puts(name);
    free(name);

    return 0;
}
1 голос
/ 11 марта 2010
char *src, *dst;
for (src = name, dst = name; *src; src++) {
   if ('a' <= *src && *src <= 'z' 
    || '0' <= *src && *src <= '9' 
    || *src == '_') *dst++ = *src;
}
*dst = '\0';

РЕДАКТИРОВАТЬ: несколько небольших ревизий. Я надеюсь избавиться от ошибок сейчас.

0 голосов
/ 11 марта 2010

Проверьте ctype для функций для проверки каждого символа в цикле.

0 голосов
/ 11 марта 2010

Взгляните на изальфанум

0 голосов
/ 11 марта 2010

Стандартная библиотека C не поддерживает регулярные выражения.
Вам нужно либо загрузить библиотеку RegEx в C (очень распространенную - PCRE ), либо сделать это в цикле (проще в данном случае, поскольку выражение ищутся все одиночные символы, поэтому без возврата).

Циклический подход будет выглядеть примерно так:

int main(int argc, char ** argv) {
   char* name = argv[1];

   // remove anything that isn't [a-z0-9_]
   char strippedName[200];
   int iIn, iOut;  // subscript in Name and StrippedName respectively

   iIn = iOut = 0;
   while (name[iIn] != '\0' && iOut < (sizeof(strippedName) + 1)) {
      // some condition defining a desirable character
      // BTW, this condition should actually be
      //    if (islower(name[iIn]) || isdigit(name[iIn] || name[iIn] == '_')
      // to match the OP's requirement exactly 
      if (isalnum(name[iIn]) || name[iIn] == '_')
         strippedName[iOut++] = name[iIn];
      iIn++;
   }
   strippedName[iOut++] = '\0';

   printf("%s", strippedName);
}

Дополнительные регулярные выражения на языке C (кроме PCRE, упомянутых ранее):

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