如何将带下划线的char数组指针转换为camelCasing?

时间:2018-10-10 06:32:13

标签: c

我正在尝试编写一个将“ word_string”转换为“ wordString”的函数。但是,下面代码的输出是“ wordSttring”。在用下一个元素的大写字母替换undescore后,我无法跳到数组的下一个元素。有什么建议吗?


View -> Tab Order

4 个答案:

答案 0 :(得分:2)

到目前为止提供的所有其他解决方案将"_"变成空字符串,并从字符串末尾删除_

#include <stddef.h>
#include <ctype.h>

void to_camel_case(char *str)  // pun_intended
{
    for (size_t i = 0, k = 0; str[i]; ++i, ++k)
    {
        while (k && str[k] == '_' && str[k + 1])                           // 1)
            str[k] = k - 1 ? toupper((char unsigned)str[++k]) : str[++k];  // 2)
        str[i] = str[k];
    }
}
  1. 跳过连续的'_'。如果存在,请确保在字符串的开头至少保留一个,在字符串的末尾保留一个。
  2. 用下一个字符替换'_',并在需要时大写。

答案 1 :(得分:0)

由于您需要再添加一个循环索引(_),因此无法正确处理删除j

您也不需要一个循环来删除非字母数字字符,仅使用_循环即可完成, 同样,一旦修剪完成,您就需要终止string,否则您的string将有垃圾字符。

void toCamelCase(char* phrase){
    int j=0;
    for (int i=0;i<strlen(phrase);i++){

        if(phrase[i] != '_' && isalnum(phrase[i])){ //Copy Alpha numeric chars not including _.
            phrase[j++] = phrase[i];
        }
        else if(phrase[i] == '_'){
            phrase[j++] = toupper(phrase[i+1]);
            i++;
        }
     }
      phrase[j] = '\0'; //Terminate the string
 }
  

注意::此方法不能处理连续的_word____string)。

答案 2 :(得分:0)

也许这样的事情可能有所帮助:

void toCamelCase(char* phrase){
    int length = strlen(phrase);
    int res_ind = 0; 
    for (int i = 0; i < length ; i++) { 
        // check for underscore in the sentence 
        if (phrase[i] == '_') { 
            // conversion into upper case 
            phrase[i + 1] = toupper(s[i + 1]); 
            continue; 
        } 
        // If not space, copy character  
        else 
            phrase[res_ind++] = s[i];         
    } 
    phrase[res_ind] = '\0'; 
}

答案 3 :(得分:0)

请注意,在当前的实现中,您尝试使用function grid(side) { pendown() repeat(2, function () { sign = 1; repeat(3, function() { forward(side * 3); left(sign * 90); forward(side); left(sign * 90); sign = 0 - sign; }); forward(side * 3); left(90); }); } 字符数组来存储已处理的字符串,但是由于该函数是局部变量并且其寿命终止,因此您将无法在该函数之外使用它流程退出该功能的那一刻。

这是我对此类功能的建议:

new

tested进行了一些输入,这就是我得到的:

#define MAX_STR_LEN 50

// assuming that 'str' is a null terminated string
void to_camel_case(char *str)
{
    int idx = 0;
    int newIdx = 0;
    int wasUnderscore = 0;

    // just to be on the safe side
    if (!str || strlen(str) >= MAX_STR_LEN)
        return;

    while (str[idx])
    {
        if (str[idx] == '_')
        {
            idx++;
            // no copy in this case, just raise a flag that '_' was met
            wasUnderscore = 1;
        }
        else if (wasUnderscore)
        {
            // next letter after the '_' should be uppercased
            str[newIdx++] = toupper(str[idx++]);
            // drop the flag which indicates that '_' was met
            wasUnderscore = 0;
        }
        else
        {
            // copy the character and increment the indices
            str[newIdx++] = str[idx++];
        }
    }

    str[newIdx] = '\0';
}