2012-02-27 100 views
0

我正在嘗試爲包含使用字符數組的更大的項目編寫一個函數。我正在使用的當前函數應該只保存字母字符並刪除任何特殊字符(例如:!#@ $?)和空格。我目前的功能工作,但由於某種原因,當我運行它時,數組的第一個字符總是被刪除。爲什麼是這樣,我怎樣才能保存第一個字符呢?數組函數從數組中刪除第一個字符

#include <stdio.h> 

int main(void) 
{ 
    char phrase[101]; 

    printf("Enter a phrase to change:"); 
    fgets(phrase, 101, stdin); 

    printf("original phrase: %s", phrase); 

    int i = 0, j = 0; 
    while(phrase[i] != '\0') 
    { 
    if(('A' <= phrase[i] && phrase[i] >= 'Z') || 
     ('a' <= phrase[i] && phrase[i] >= 'z')) 
    { 
     phrase[j] = phrase[i]; 
     i++; 
     j++; 
    } 
    else 
     i++; 

    phrase[j] = '\0'; 
    } 

    printf("new phrase: %s\n", phrase); 

    return 0; 
} 

回答

4

比較運算符的方向是錯誤的。相反的:

if(('A' <= phrase[i] && phrase[i] >= 'Z') || 
    ('a' <= phrase[i] && phrase[i] >= 'z')) 

您需要:

if(('A' <= phrase[i] && phrase[i] <= 'Z') || 
    ('a' <= phrase[i] && phrase[i] <= 'z')) 

你寫它會跳過大寫字母,這可能是爲什麼它跳過你輸入的第一個字符的方式。

您還應該將行phrase[j] = '\0';移動到循環之後,否則可能會覆蓋下一個要讀取的字符。

+0

你把它釘在頭上,簡單修復,謝謝!:) – Ryan 2012-02-27 17:53:58

2

嗯,我猜第一個字符不是字母數字。你有一個具體行刪除它:

phrase[j] = '\0'; 

要麼你刪除的第一個字符(如果它不是字母和數字),或刪除第二個(如果第一個字母)。

只有在完成掃描字符串後,才應該放置尾部\ 0。

編輯:@interjay指出,你的檢查是錯誤的,所以你的第一個字符是總是對待爲不字母數字。這就是爲什麼你抹去它。

+0

是的,我發現一旦我切換我的支票是必要的,有循環之外,其他明智我不會得到正確的輸出。謝謝! – Ryan 2012-02-27 17:54:56

0

如何使用ctype.hisalpha()

if (isalpha(phrase[i])) { 
    phrase[j] = phrase[i]; 
    /* ... */ 
} 

但談論你的問題:

while循環只去過一次,因爲循環的謂語是第一次執行後不能滿足,因爲你在設置phrase[j]'\0'循環第一次運行。

編輯:哦,我還沒仔細閱讀if條件。正如@interjay指出的,它是也是錯誤。

1

我想因爲你的第一個字符是唯一的大寫字母,而你的邏輯錯誤。

if(('A' <= phrase[i] && phrase[i] >= 'Z') ||  
    ('a' <= phrase[i] && phrase[i] >= 'z'))  

應該

if(('A' <= phrase[i] && phrase[i] <= 'Z') ||  
    ('a' <= phrase[i] && phrase[i] <= 'z'))  

雖然C庫確實提供因而isalpha這也將在EBCDIC字符集,其中 'A' 到 'Z' 是不連續的工作。