2012-10-26 39 views
3

我正在學習C語言中期的一些基本功能,並且我意識到我錯誤地抄下了我的教師示例。我可能只是太累了,現在不想這樣做,而且我會不勝感激。如何手動替換C中的字符串中的最後一個匹配項?

void replace_last(char s[], int oldc, int newc){ 
    size_t i, pos-1; /* I have no idea why I wrote pos-1. I know I need it though */ 
     for(i = 0; s[i] != '\0'; i++){ 
      if(s[i] == oldc) 
       pos == i; 
      if(pos != -1) 
       s[pos] = newc; 
     } 
} 
+3

「我知道我需要它,但」 - 我真的不認爲你的代碼中有語法錯誤。 – Mat

+4

我想,應該有pos = - 1;因爲只是pos-1評估rvalue這是沒有分配給任何東西..我認爲這是初始化pos – Omkant

回答

1
void replace_last(char s[], int oldc, int newc){ 
    size_t i, pos = -1; 
    for(i = 0; s[i]; i++) 
     if(s[i] == oldc) 
     pos = i; 
    if(pos != -1) 
     s[pos] = newc; 
} 

所以你複製的代碼有三個問題:pos-1pos == i和第三,邏輯if(pos != -1) s[pos] = newc;需要以外的循環。

編輯:只是爲了四捨五入的答案,這樣的「非手工」的方法是,例如:

void replace_last(char s[], int oldc, int newc) { 
    if (strrchr(s, oldc)) 
     *strrchr(s, oldc) = newc; 
} 

(你可以,如果你願意,保存返回的在一個臨時指針strrchr(),以避免第二次調用strrchr(),但這種不必要的大概是:GCC與-O1做這個自動爲您)

+0

解決了一切。謝謝。沒有正確記錄,我應該得到這個問題。 – MacSalty

2

裏面IST如果你正在做pos==i說法,應該是pos=i

因爲pos==i是有條件的聲明,pos = i是分配

void replace_last(char s[], int oldc, int newc){ 
    size_t i, pos=-1; /* I have no idea why I wrote pos-1. I know I need it though */ 
     for(i = 0; s[i] != '\0'; i++){ 
      if(s[i] == oldc) 
       pos = i; 
      if(pos != -1) 
       s[pos] = newc; 
     } 
} 

我想你想通過更換oldcnewc找到oldc的位置,然後更改pos的值,並在相同的迭代中在做s[pos]=new將取代oldc wtih newc

現在,該代碼是好的..你可以運行或試運行,並檢查它

+0

謝謝Omkant ...這是固定的問題的一部分。現在它將取代該字母的所有實例。完全有可能我把它搞得更多。 – MacSalty

+0

@SpaceJesus:你打算什麼都不清楚,什麼是pos pos btw – Omkant

+0

pos應該跟蹤字符串中的當前位置。基本上,如果我通過oreo,o,m - 我的字符串應該更改爲orem – MacSalty

2

行號:5 pos==i應更換

相關問題