2017-04-04 22 views
1

我想創建一個程序來檢查給定的字符串是否是迴文或emordinlap(或反向對),但是當運行我的程序時它正在輸出字符串是迴文但不是反向對(例如racecar應該都是)。試圖創建一個程序來檢查palindromes和semordinlap

我一直在調試和主演這個計算屏幕3個小時,我不知道發生了什麼事情。我的第一個直覺是它來自checkPali函數,所以我將它分配給指針,沒有運氣,同樣的問題。

我的第二個猜測是把printf陳述無處不在(我清理它們),也沒有運氣。

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

static void *helpPage(void) 
{ 
    puts("usage: epi -h -t -s [string] [file]\n"); 
    puts("-h  Print this help and exit\n"); 
    puts("-t  Run the test strings.\n"); 
    puts("-s  Input a string to check if it is either a palindrome or"); 
    puts("   a emordinlap, followed by the path to a file.");; 
} 

static char *reverse(char *str) 
{ 
    // reverse a given string 

    char tmp, *src, *dst; 
    size_t len; 

    if (str != NULL) 
    { 
     len = strlen(str); 
     if (len > 1) 
     { 
      src = str; 
      dst = src + len - 1; 

      while (src < dst) 
      { 
       tmp = *src; 
       *src++ = *dst; 
       *dst-- = tmp; 
      } 
     } 
    } 
    return str; 
} 

static char *strip(char *s) 
{ 
    // strip a string of a new line 

    return strtok(s, "\n"); 
} 

static bool checkEpi(char *reversed, char *filePath) 
{ 
    // check if the word matches in a given file 
    // or if the word is an emordnilap 

    FILE *wordList; 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 

    wordList = fopen(filePath, "r"); 
    if (wordList == NULL) 
    { 
     perror("Failed to open file: "); // file probably doesn't exit 
    } 
    while ((read = getline(&line, &len, wordList)) != -1) // read the file line by line 
    { 
     if (strip(line) == reversed) 
     { 
      return true; // return true if the word matches 
     } 
    } 
    fclose(wordList); 
} 

static bool checkPali(char *origin, char *reversed) 
{ 
    // check if a given word is a palindrome or not 

    if (*origin == *reversed) 
     return true; 
} 

static void checkAll(char *origin, char* reverse, char *filePath) 
{ 
    // basically a main function to check if it's a palindrome or a emordnilap 

    bool paliRes = checkPali(origin, reverse); 
    bool epiRes = checkEpi(reverse, filePath); 
    if (paliRes == true) 
    { 
     printf("\n%s is a palindrome, it is the same forward and backwards\n", origin); 
    } 
    else 
    { 
     printf("\n%s is not a palindrome, it is not the same forward and backwards\n", origin); 
    } 

    if (epiRes == true) 
    { 
     printf("Reverse of %s is a emordinlap, it spells a word backwards.\n\n", origin); 
    } 
    else 
    { 
     printf("Reverse of %s is not a emordinlap, it does not spell a word backwards\n\n", origin); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    if (argv[1] == NULL) 
    { 
     puts("\nYou failed to pass a valid flag...\n"); 
     helpPage(); 
     return 1; 
    } 
    else 
    { 

     char *testStrings[] = {"a", "ab", "abc", "another", "cbc", "|0|", "palindrome"}; 
     int i; 
     char s[10000]; 
     char *defaultWordList = "/usr/share/dict/american-english"; 
     size_t optInt; 

     for (optInt = 1; optInt < argc && argv[optInt][0] == '-'; optInt++) 
     { 
      switch(argv[optInt][1]) 
      { 
       case 't': 
       { 
        for (i = 0; i < sizeof(testStrings)/sizeof(testStrings[0]); i++) 
        { 
         strcpy(s, testStrings[i]); 
         char *origin = testStrings[i]; 
         char *revStr = reverse(s); 
         checkAll(origin, revStr, defaultWordList); 
        } 
        return 0; 
       } 

       case 's': 
       { 
        if (argv[2] == NULL) 
        { 
         puts("\nYou must provide a string to test.\n"); 
         helpPage(); 
         return 1; 
        } 
        else if (argv[3] == NULL) 
        { 
         puts("\nYou must pass a valid file path to use as a wordlist.\n"); 
         helpPage(); 
         return 1; 
        } 
        else 
        { 
         //strcpy(s, argv[2]); 
         char *origin = argv[2]; 
         char *revStr = reverse(argv[2]); 
         checkAll(origin, revStr, argv[3]); 
         return 0; 
        } 
       } 

       case 'h': helpPage(); return 0; 
      } 
     } 
     return 0; 
    } 
} 

我做錯了什麼地方我的陳述沒有正確比較?

回答

1

你不能有意義的C.

比較使用 ==字符串
if (*origin == *reversed) 

這只是比較每個兩個參數的第一個字符。改爲嘗試strcmp

static bool checkPali(char *origin, char *reversed) 
{ 
    /* match if result of strcmp is 0 */ 
    return strcmp(origin, reversed) == 0; 
} 

您將需要

if (strip(line) == reversed) 
了類似的變化
相關問題