2013-10-21 83 views
0

這不是家庭作業,而是爲期中考察。使用指針替換C字符串中的字符

我不能使用任何類型的數組索引的諸如STR [1]或*(STR + I)

我必須採取的c字符串 「EECS280ISAWESOME」,並與C-代替 'E'字符串「XY」。我還必須考慮到「XY」變量的多個長度。

主要有以下給出:

int main() { 
    const char* S = "EECS280ISAWESOME"; 
    const char* P = "XY"; 
    char result[256]; 
    subsituteChar(S,P,'E', result); 
    cout << result << endl; 
} 

我的解決方法看似複雜/糟糕的做法/醜。我可以更好地使用推理並添加*(R+1),但我不認爲它是允許的。

void subsituteChar(const char* S, const char* P, char c, char* R) { 
    while(*S != '\0') { 
     if(*S == c) { 
      const char* PP = P; 
      while (*P != '\0') { 
       *R = *P; 
       R++; 
       P++; 
      } 
      P = PP; 
     } else { 
      *R = *S; 
      R++; 
     } 
     S++; 
    } 
} 

這個工程,但我剩下XYXYCS280ISAWXYSOMXY2。我不知道奇怪的2來自哪裏。

+1

你忘了NUL終止輸出緩衝區。這就是垃圾最終來自哪裏。 –

+0

這實際上大多數都很好,但也許是在需要時複製「P」的一個小函數。你應該改變'PP'的用法,使其成爲嵌套循環中的迭代器,並避免重置'P'。 – Keith

回答

0

由於這是一個研究問題,下面是一個啓動的提示。嘗試初始化您的結果數組。我這樣做:

char result[256]; 
for (int i = 0; i < 250; ++i) 
    result[i] = 'a'; 
result[250] = 0; 

現在再次運行你的代碼,你會發現你有很多的「一」字在你的輸出端,最多的地步,你到250字也就是說,你會看到:

「XYXYCS280ISAWXYSOMXYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」

如果你想弄清楚其餘的自己,現在就停止閱讀。


問題是你沒有顯式地null結束你的字符串。

請注意,S被替換的最後一個字符不是問題,而是與while循環的終端條件相關。由於您不是手動複製S上的'\ 0'字符,因此您希望結果數組充滿'\ 0'字符,C和C++不保證這些字符。

只需添加下面一行到你的substituteChar函數結束時將解決這個問題:

*R = '\0';

0

這是否合適?

#include<stdio.h> 
int main() { 
    const char* S = "EECS280ISAWESOME"; 
    const char* P = "XY"; 
    char result[256]; 
    while(*S) 
    { 
     if(*S=='E') 
      printf("XY"); 
     else 
      printf("%c", *S); 
     S++; 
    } 
} 
0

你的代碼是完全正確的,伴隨着小錯誤。有一個字符串的事實,everry 字符串應該以空字符終止。所以只需添加* R ='\ 0';在 的盡頭,而函數和此算法完美工作。