我正在嘗試使用地圖洗掉字串中的重復項。通過 GDB 運行它我無法弄清楚代碼在哪里失敗,盡管我的邏輯似乎是正確的。有人可以指出錯誤嗎?
int main() {
char *str="I had my morning tea";
int len = strlen(str);
int dupArr[256] = {0};
//Build the map
int i=0;
for(i;i<256;i )
dupArr[str[i]] ;
//If the count is 1 then print that value.
i=0;
for(i;i<256;i ) {
if(dupArr[str[i]] == 1) {
printf("%c\n",str[i]);
}
}
}
輸出
I h y o r i g t % c 4 @ } ` 8 ? F J
我起床到 't' ,這是正確的,但后來我看到了魔法字符。
uj5u.com熱心網友回復:
您的字串長度為 ,len但您正在遍歷till 256這是out of bound.
Use len插入哈希時。
int i=0;
for(i;i<LEN;i )
dupArr[str[i]] ;
此外,如果您正在檢查重復項,那么應該是bigger than 1因為您是 第一個遇到的字符
if(dupArr[str[i]] > 1)
uj5u.com熱心網友回復:
除了Mark Ezberg的好答案,請注意,dupArr[str[i]] ;當str[i] < 0.
最好將字符視為unsigned char:
int dupArr[UCHAR_MAX 1] = {0};
....
dupArr[(unsigned char) str[i]] ;
將這個想法和其他想法結合在一起:
int main(void) {
char *str="I had my morning tea";
size_t dupArr[UCHAR_MAX 1] = {0};
unsigned char *s = (unsigned char *) str;
while (*s) {
dupArr[*s] ;
s ;
}
for(unsigned i = 0; i <= UCHAR_MAX; i ) {
// A duplicate is when dupArr[i] is _more_ than 1.
if(dupArr[i] > 1) {
printf("%c\n",str[i]);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356306.html
標籤:C
上一篇:在c中列印出一個二維字符陣列
下一篇:評估/列印用作宏輸入的函式回傳值
