2013-12-11 74 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