是否有更好/更简单的方法从现有字符串创建\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';
}
答案 0 :(得分:5)
你可以做的一件事就是立即让你的代码更清晰:使用字符文字:
if ((*ptr >= '0' && *ptr <= '9') ||
(*ptr >= 'A' && *ptr <= 'Z') ||
(*ptr >= 'a' && *ptr <= 'z') ||
*ptr == '_')
更好的解决方案是使用isalnum。
if (isalnum(*ptr) || *ptr == '_')
请注意,不同的区域设置可能会将不同的字符视为字母数字。
您的代码还有一些问题:
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