我正在尝试用 C 编写简单的 removeAt(char* str, int pos),但对结果感到困惑。
char c[] = "abcdef";
char* c1 = removeAt(c, 3);
cout << c1;
如果我这样做:
static char* removeAt(char* str, int pos)
{
int i = 0;
for(i = pos; str[i] != '\0'; i++)
{
str[i] = str[++i];
}
str[i] = '\0';
return str;
}
字符串保持不变 "abcdef";
如果我在做:
static char* removeAt(char* str, int pos)
{
int i, k =0;
for(i = pos, k = pos; str[i] != '\0'; i++)
{
str[i] = str[++k];
}
str[i] = '\0';
return str;
}
确实按预期工作。
最佳答案
在这个循环中
for(i = pos; str[i] != '\0'; i++)
{
str[i] = str[++i];
}
您通过执行 i++
更改了 i
的值,因此您最终会每两个字符或类似的字符丢失一个字符。将 i++
更改为 i+1
。
编辑:顺便说一下,这条线
str[i] = str[++i]
是未定义的行为,因为它没有指定何时发生增量(在评估左侧之前或之后?)。如果首先评估右侧,那么您的代码将是
i++;
str[i] = str[i];
如您所见,实际上什么都不做。
关于c - 从 c 字符串中删除 charAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527214/