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

时间:2010-09-09 15:33:54

标签: 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

感谢您的评论,新功能:

  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';
  }

2 个答案:

答案 0 :(得分:5)

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

if ((*ptr >= '0' && *ptr <= '9') ||
    (*ptr >= 'A' && *ptr <= 'Z') ||
    (*ptr >= 'a' && *ptr <= 'z') ||
    *ptr == '_')

更好的解决方案是使用isalnum

if (isalnum(*ptr) || *ptr == '_')

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

您的代码还有一些问题:

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

答案 1 :(得分:1)

添加到Mark的答案:

sprintf返回它写的char数。您可以将其用作:

    count = sprintf(new, "str_");
    for (ptr = name + 4; *ptr; ptr++) {

            if ((*ptr >= '0' && *ptr <= '9') || (*ptr >= 'A' && *ptr <= 'Z') ||
                (*ptr >= 'a' && *ptr <= 'z') || *ptr == '_')
            {
                    *(new+count) = *ptr;
                    count++;
            }
    }
    *(new+count) = 0; // terminating null char