我试图在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;
}
按预期工作。
答案 0 :(得分:3)
在这个循环中
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];
正如你所观察到的,有效地无所作为。