代码之家  ›  专栏  ›  技术社区  ›  Paul Tarjan

C中的筛选器字符串

  •  1
  • Paul Tarjan  · 技术社区  · 16 年前

    如何在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 回复  |  直到 16 年前
        1
  •  1
  •   Carl Smotricz    16 年前
    char *src, *dst;
    for (src = name, dst = name; *src; src++) {
       if ('a' <= *src && *src <= 'z' 
        || '0' <= *src && *src <= '9' 
        || *src == '_') *dst++ = *src;
    }
    *dst = '\0';
    

        2
  •  1
  •   caf    16 年前
    #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;
    }
    
        3
  •  1
  •   paxdiablo    16 年前

    如果您只想从第一个参数中去掉那些不需要的字符,就不需要分配内存,只需逐个字符地遍历输入字符串。而且,如果您知道您将在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;
    }
    
        4
  •  0
  •   rerun    16 年前

    看一看 isalphanum

        5
  •  0
  •   mjv    16 年前


    您需要下载一个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);
    }
    

        6
  •  0
  •   C.D. Reimer    16 年前

    退房 ctype 函数来测试循环中的每个字符。