我正在尝试编写一个将“ word_string”转换为“ wordString”的函数。但是,下面代码的输出是“ wordSttring”。在用下一个元素的大写字母替换undescore后,我无法跳到数组的下一个元素。有什么建议吗?
View -> Tab Order
答案 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 :(得分: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';
}