更容易从现有字符串创建字母数字+'_'字符串?

use*_*747 2 c string

是否有更好/更简单的方法\w+从现有字符串创建字符串?

 char *FixName(char *name)
 {
     char *ptr, tmp;
     char *new = malloc(strlen(name)+1);
     sprintf(new, "str_");
     for (ptr = name + 4; *ptr; ptr++)
     {
         if ((*ptr >= '0' && *ptr <= '9') ||
             (*ptr >= 'A' && *ptr <= 'Z') ||
             (*ptr >= 'a' && *ptr <= 'z') ||
             *ptr == '_')
         {
             tmp = *(ptr+1);
             *(ptr+1) = '\0';
             strcat(new, ptr);
             *(ptr+1) = tmp;
         }
     }
     free(name);
     return new;
 }

 // USAGE:
 //char *j = strdup("str_[](1.00)");
 //printf("J: %s\n", j);
 //j = FixName(j);
 //printf("J: %s\n", j);
 //free(j);
 // OUTPUT:
 //J: str_[](1.00)
 //J: str_100
Run Code Online (Sandbox Code Playgroud)

感谢您的评论,新功能:

  void FixName(char *name)
  {
      char *ptr;
      unsigned short count = strlen("str_");
      for (ptr = name + count; *ptr; ptr++)
      {
          if ((*ptr >= '0' && *ptr <= '9') ||
              (*ptr >= 'A' && *ptr <= 'Z') ||
              (*ptr >= 'a' && *ptr <= 'z') ||
              *ptr == '_')
          {
              *(name+count) = *ptr;
              count++;
          }
      }
      *(name+count) = '\0';
  }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

你可以做的一件事就是立即使你的代码更清晰:使用字符文字:

if ((*ptr >= '0' && *ptr <= '9') ||
    (*ptr >= 'A' && *ptr <= 'Z') ||
    (*ptr >= 'a' && *ptr <= 'z') ||
    *ptr == '_')
Run Code Online (Sandbox Code Playgroud)

更好的解决方案是使用isalnum.

if (isalnum(*ptr) || *ptr == '_')
Run Code Online (Sandbox Code Playgroud)

请注意,不同的区域设置可能会将不同的字符视为字母数字.

您的代码还有一些问题:

  • 在为其分配内存之前,您可以计算出所需字符串的大小,以避免过度分配.
  • 您可以通过保持指向目前已达到的位置的指针来构建结果而不使用strcat.
  • 我不喜欢这个free函数内部的调用.您不能确定作为参数传入的字符串是使用malloc分配的.