2013-12-11 148 views
0

我想在C中编写简单的removeAt(char * str,int pos),但被结果困惑。从c字符串中删除charAt

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

在你的第一个例子中,你每循环增加'i'两次。第二,你只增加一次'i'和'k'。 –

+0

为什么不使用简单的'strcpy(str + pos,str + pos + 1);'? – unxnut

+0

只是在玩面试准备的字符串操作,一直没有触及它。 – inside

回答

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]; 

正如您所观察的那样,实际上无所作为。

+0

谢谢,愚蠢的错误。 – inside

+1

如果您觉得答案能解决您的问题,您应该点击检查按钮接受它。 –

+0

谢谢安德烈,但尽管我的感受很难接受这个答案,但由于SO规则,我还是无法做到。 – inside