2013-03-23 88 views
0

這是在學校作業。我不是在向正確的方向推動正確的答案。關於爲什麼會出現這種錯誤的解釋會很好,並解釋正確的方法。這個C程序應該做的是在用戶輸入中讀取沒有空格和標點符號並將其分配給字符數組字符串。這個數組然後應該被傳入函數迴文。 Palindrome應該是字符串的長度,如果等於1或0,則返回TRUE或1,然後檢查字符串的第一個和最後一個字符。如果它們匹配,則檢索第二個和第二個到最後一個字符以及中間的所有字符,並將其傳遞到函數迴文。從c中的字符串中刪除標點符號和空格?

#include<stdio.h> 
#include<ctype.h> 
#include<string.h> 

#define TRUE 1 
#define FALSE 0 
typedef int Bool; 

Bool palindrome(char str[]); 
main() 
{ 
char string[1000], ch; 
int i = 0; 

printf("Enter a message: "); 
while((ch = getchar()) != '\n'){ 
    if(isspace(ch)==FALSE || ispunct(ch)==FALSE); 
    string[i] = tolower(ch); 
    i++; 
} 

string[i] = '\0'; 

printf("\n"); 
if(palindrome(string)) 
    printf("Palindrome\n"); 
else 
    printf("Not a palindrome\n); 

return 0; 
} 

Bool palindrome(char str[]) 
{ 
    int length = strlen(str); 
    if((length == 1) || (length == 0)) 
    return TRUE; 
    else 
    { 
    if((str[0] == str[length - 1]) 
     { 
     char str_new[length-1]; 
     int i, j; 
     for(i = 1, j = 0; str[i]!=str[length-1]; i++, j++) 
      str_new[j] = str[i]; 

     str_new[i] = '\0'; 
     palindrome(str_new); 
     } 
     else 
     return FALSE; 

    } 
} 

不管它輸入的東西總是打印出來的字符串是非迴文。例如,當我輸入

他作爲一個魔鬼生活,呃?

它打印出

不是迴文

此外,當我編輯的程序使用先前的輸入是

檢查什麼是數組串他是一個魔鬼,呃?

隨意評論我的代碼的任何其他方面,你看到代碼使用改進。他們確實沒有提供任何其他的東西,除了是它的權利或不是我們的代碼。

編輯:
我做了檢查,看看char數組中的值是什麼。我在最後一次報名前就說過了。

+0

提示:在將消毒過的字符串傳遞給'迴文()',打印出來。然後你會知道你是否正確清理了它。 – alexis 2013-03-23 16:56:28

+0

'if(!isspace(ch)&&!ispunct(ch))'或更好:'if(isletter(ch))' – alexis 2013-03-23 17:01:21

+0

@user我想你的問題已經被回答了:http://meta.stackexchange.com/questions/5234/ – 2013-03-23 18:05:02

回答

1

這裏看看......

while((ch = getchar()) != '\n'){ 
    if(isspace(ch)==FALSE || ispunct(ch)==FALSE); 
    string[i] = tolower(ch); 
    i++; 
} 

注意 ';'在if語句結尾處。那'''導致字符串[i] = tolower(ch)總是執行。另外,你的邏輯是不正確的,如果這個字符不是空格,並且它不是標點符號,你希望代碼執行。

另外,請注意您的縮進。 i ++也應該放在if語句中,但是它缺少大括號。因此,即使您刪除了';',i ++仍然會始終執行。所以......

while((ch = getchar()) != '\n'){ 
    if(isspace(ch)==FALSE && ispunct(ch)==FALSE) 
    { 
    string[i] = tolower(ch); 
    i++; 
    } 
} 

或者......甚至更好的還是...

while((ch = getchar()) != '\n'){ 
    if(isspace(ch)==FALSE && ispunct(ch)==FALSE) 
    string[i++] = tolower(ch); 
} 

一個風格的註釋,以及...它往往是一個好主意,有從功能單一的退出點爲了維護和可讀性。其他人可能在那裏有不同的爭論,但這是我過去30年來在DoD工作中生活的那條硬性規定。看看這個可讀性,看看它是否對你更有意義。

Bool palindrome(char str[]) 
{ 
    Bool result = TRUE; 
    int length = strlen(str); 

    if(length > 1 && str[0] == str[length-1]) 
    { 
    char str_new[length-1]; 
    int i, j; 

    for(i = 1, j = 0; str[i]!=str[length-1]; i++, j++) 
     str_new[j] = str[i]; 

    str_new[i] = '\0'; 
    result = palindrome(str_new); 
    } 

    return result; 
} 

最後......但從效率來看,而不是複製字符串,你可以很容易地索引它...

Bool palindrome(char str[]) 
{ 
    Bool result = TRUE; 
    int length = strlen(str); 

    if(length > 1 && str[0] == str[length-1]) 
    { 
     str[length-1] = '\0'; 
     result = palindrome(&str[1]); 
    } 

    return result; 
} 
+0

if中的邏輯錯誤,迴文函數太複雜。 – 2013-03-23 17:12:51

+0

所以現在我們已經告訴過你如何解決這個問題,並且你已經完成了。做得好。但是你的「迴文」功能根本不起作用。對於我的生活,我無法理解爲什麼這個答案得到了提升。 – 2013-03-23 17:21:32

1
if(isspace(ch)==FALSE || ispunct(ch)==FALSE); 

這是你的錯誤。首先,最後不應該有分號(;)。

其次,你不應該使用或者,你應該使用因爲你要確保你過濾除字母一切:

​​

另外:

for(i = 1, j = 0; str[i]!=str[length-1]; i++, j++) 

在這裏,布爾表達式是錯誤的。你應該評估j

for(i = 1, j = 0; j < length - 1; i++, j++) 

最後,您對i++聲明的定位,同時要追加字符到新字符串不正確。將它們放回原處,以便編譯器知道它需要成爲while循環體的一部分,並且在if塊之外。

0

一些明顯的要點:

  • 在這個問題的代碼不會編譯。
  • 您的主要聲明不是標準的。
  • if聲明在行尾有一個錯誤的分號。
  • if語句中的邏輯錯誤。邏輯或測試將始終評估爲真,因爲一個字符不能既是空格也是標點符號。
  • 您的迴文檢查功能比需要的複雜得多。

的關鍵變化,使的是,你的if的說法應該是像這樣:

if (!isspace(ch) && !ispunct(ch)) 

一個完整的工作程序是這樣的:

#include<stdio.h> 
#include<string.h> 

#define TRUE 1 
#define FALSE 0 
typedef int Bool; 

Bool palindrome(char str[]); 

int main(void) 
{ 
    char string[1000], ch; 
    int i = 0; 

    printf("Enter a message: "); 
    while((ch = getchar()) != '\n'){ 
     if (!isspace(ch) && !ispunct(ch)) 
     { 
      string[i] = tolower(ch); 
      i++; 
     } 
    } 

    string[i] = '\0'; 
    printf("string = %s\n", string); 
    if(palindrome(string)) 
     printf("Palindrome\n"); 
    else 
     printf("Not a palindrome\n"); 

    return 0; 
} 

Bool palindrome(char str[]) 
{ 
    int left = 0; 
    int right = strlen(str)-1; 
    while (left<right) 
    { 
     if(str[left] != str[right]) 
      return FALSE; 
     left++; 
     right--; 
    } 
    return TRUE; 
} 

這裏是輸出:

 
Enter a message: He lived as a devil, eh? 
string = helivedasadevileh 
Palindrome 
+0

如果你不關心命令行參數,主要語句是完全合法的 – 2013-03-23 17:15:00

+0

@KScottPiel我向你推薦這個問題:http://stackoverflow.com/questions/2108192/what-are-the-valid-signatures-for- CS-主功能 – 2013-03-23 17:17:28