2016-01-22 36 views
0

我想創建一個程序來檢查一個給定的數組/字符串是否是迴文並且它不工作。該程序只在每個給定的陣列上打印「0」,即使在迴文中也是如此。程序檢查一個數組是否是迴文

int main() 
{ 

    char string[100]= {0}; 
    char stringReverse[100]= {0}; 

    int temp = 0; 
    int firstLetter = 0; 
    int lastLetter = 0; 

    printf("Please enter a word or a sentence: "); 
    fgets(string, 100, stdin); 

    strcpy(stringReverse , string); // This function copies the scanned array to a new array called "stringReverse" 

    firstLetter = 0; 
    lastLetter = strlen(string) - 1; //because in array, the last cell is NULL 

    // This while reverses the array and insert it to a new array called "stringReverse" 
    while(firstLetter < lastLetter) 
    { 
     temp = stringReverse[firstLetter]; 
     stringReverse[firstLetter] = stringReverse[lastLetter]; 

     stringReverse[lastLetter] = temp; 

     firstLetter++; 
     lastLetter--; 
    } 

    printf("%s %s", stringReverse, string); 

    if (strcmp(stringReverse , string) == 0) 
    { 
     printf("1"); 
    } 
    else 
    { 
     printf("0"); 
    } 
} 
+4

對於這樣一個簡單的任務代碼太多。 –

+0

我已經發布了類似問題的答案[這裏](http://stackoverflow.com/a/33806921/4487286),你可以很容易地適應你的需求 – milevyo

回答

4

比方說,我們實現一個簡單有趣的事情是

int check_palindrome (const char *s) { 
    int i,j; 
    for (i=0,j=strlen(s)-1 ; i<j ; ++i, --j) { 
     if (s[i] != s[j]) return 0; // Not palindrome 
    } 
    return 1; //Palindrome 
} 

我覺得這是更簡單;)

對於貼有問題的代碼: 注意與fgets的( )。它停在第一個'\ n'或EOF並保持'\ n'字符。

所以,如果你給雷達爲前,結果字符串將「雷達\ n」,不與「\ nradar」

+0

沒有比這更簡單的方法來做到這一點。這就是你需要的一切。不要忘記寫一個函數來檢查前導/尾隨空格,你應該沒問題。如果遇到問題,C實際上有一個名爲'isspace()'的函數,它接受一個字符(技術上它接受一個int,但只是給它一個字符),並返回一個非零值,如果它是一個空白字符\ n,\ t,\ v或空格。否則返回0。 – James

1

fgets增加了一個 '\ n' 匹配最後。 因此,如果用戶輸入「aba」,string包含「aba \ n」。 reverseString包含「\ naba」。

所以它不匹配。

在與fgets之後,將其複製到reverseString之前添加此代碼

int l = strlen(string) - 1; 
string[l] = 0; 

這將去除出「\ N」末。除此之外,您可以在不需要第二個緩衝區或strcpystrlen調用的情況下完成整個程序。

+0

細節:'fgets()'不_add_''\ n''。它很簡單,像所有其他輸入字符一樣保存。如果用戶輸入只有3個字符:'「aba」',沒有鍵,然後'stdin'被關閉,輸入只會是'a'',''b'',''c''。 'fgets()'不會添加終止空字符。要安全刪除潛在的''\ n'',請考慮http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input/27729970#27729970 – chux

1

你在你的代碼的幾個問題:

  • 首先你忘了上次大括號};
  • 然後您忘記刪除尾部\n(或者也可能在Windows下\r)在string;
  • 您不需要將字符串還原爲新字符串;一通檢查就足夠了:

這裏是一個工作代碼:

#include <stdio.h> 
#include <string.h> 
int main() 
{ 

    char string[100]= {0}; 

    int temp = 0; 
    int firstLetter = 0; 
    int lastLetter = 0; 

    printf("Please enter a word or a sentence: "); 
    fgets(string, 100, stdin); 

    firstLetter = 0; 
    lastLetter = strlen(string) - 1; //because in array, the last cell is NULL 
    while ((string[lastLetter]=='\n')||(string[lastLetter]=='\r')) { 
     lastLetter--; 
    } 

    // This while reverses the array and insert it to a new array called "stringReverse" 
    temp = 1; 
    while(firstLetter < lastLetter) 
    { 
     if (string[firstLetter] != string[lastLetter]) { 
      temp = 0; 
      break; 
     } 

     firstLetter++; 
     lastLetter--; 
    } 

    if (temp) 
    { 
     printf("1"); 
    } 
    else 
    { 
     printf("0"); 
    } 
} 
+0

注意:'fgets(string, ...); int lastLetter = strlen(string) - 1; while((string [lastLetter] ...')是一種黑客攻擊,'string'的第一個字符爲''\ 0'',然後'string [-1]'爲UB,這很容易。 http://chackoverflow.com/q/2693776/2410359 – chux

+0

@chux是的,但這只是對原始海報帖子的改編;我只是改變了有問題的帖子,當然其他的東西也可以改進。 –

2

問題:

比方說,你輸入的字符串RACECAR輸入您的程序,並按下輸入時,這會在您的緩衝流中放入一個換行符或一個'\n',並且這也將作爲您的字符串的一部分被fgets讀取,因此您的程序將有效地結束檢查RACECAR\n是迴文,它不是

解決方案:

後初始化lastLetterstrlen(string) - 1檢查,如果在字符串中的最後一個字符(或在lastLetter指數的字符是換行符(\n)如果是這樣,減一lastLetter讓你的程序檢查,如果你的字符串(RACECAR)的其餘部分是迴文。

lastLetter = strlen(string) - 1; //because in array, the last cell is NULL 

// Add these 2 lines to your code 
// Checks if the last character of the string read by fgets is newline 
if (string[lastLetter] == '\n') 
    lastLetter--; 
0

您可以通過這個樸也做到這一點。

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

int main() 
{ 
    char string[10], revString[10]; 
    printf("Enter string for reversing it...\n"); 
    scanf("%s", string); 

    int stringLength = strlen(string); 

    for(int i = 0; string[i] != '\0'; i++, stringLength--) 
    { 
    revString[i] = string[stringLength - 1]; 
    } 

    if(strcmp(string, revString) == 0) 
     printf("Given string is pelindrom\n"); 
    else 
     printf("Given string is not pelindrom\n"); 
} 
+0

建議'scanf(「%s」,tmp);'和編碼'gets(tmp)'一樣好,不推薦。 – chux

相關問題