【发布时间】:2021-11-06 22:04:21
【问题描述】:
我想写一个不使用tolower的函数将CamelCase转换为snake_case。
示例:helloWorld -> hello_world
这是我目前所拥有的,但是输出是错误的,因为我在这里覆盖了字符串中的一个字符:string[i-1] = '_';。
我得到hell_world。我不知道如何让它工作。
void snake_case(char *string)
{
int i = strlen(string);
while (i != 0)
{
if (string[i] >= 65 && string[i] <= 90)
{
string[i] = string[i] + 32;
string[i-1] = '_';
}
i--;
}
}
【问题讨论】:
-
假设底层数组有足够的空间,您需要将字母向前移动以便为
'_'腾出空间。使用memmove(),因为memcpy()和strcpy()在使用同一数组中的地址调用时都会调用UB。 否则你需要malloc()(和/或realloc()) -
[
realloc()]... 并更改函数签名。 -
我可能会分两次执行此操作:一次用于计算要插入的大写字母 == 下划线的数量,然后将字符处理/复制到使用分配的新缓冲区第一步计算的大小。
标签: c string c-strings text-manipulation