2017-01-14 19 views
0

Привет, я узнал в классе о библиотеке string.h и, в частности, о функции strcmp, которая сравнивается с строками. , и если первая строка появляется сначала в словаре, она вернет число, большее, чем 0, если вторая строка больше, чем первая, чем она вернет число меньше 0, и если они равны, то он должен вернуть 0. ив использовал его, как это:strcmp возвращает только 0 (ошибка palindrom algo)

strcmp(strArr , strrev(strArr)); 

Не стесняйтесь, чтобы обучить меня.

Код:

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

#define MAX_LENGTH 100 
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0. 
int main(void) 
{ 
    char strArr[MAX_LENGTH]; 
    printf("Enter string (max length 100 chars): "); 
    fgets(strArr , MAX_LENGTH , stdin); 
    int pali = strcmp(strArr , strrev(strArr)); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    system("PAUSE"); 
    return 0; 
} 

моя проблема заключается в том, что код ниже, когда я вхожу, т.е. «а» печатает на экран Palindrom, который он должен напечатать Не Palindrom, он никогда не печатает Не Palindrom

+0

Вы пробовали распечатывание значения '' strArr' и strrev (strArr) ', чтобы убедиться, что они имеют значение, которые вы ожидаете? –

+0

damn ive удалось сделать pali «int», извините за это. – spyc

+0

Ваше «исправление *» для способа работы 'strcmp()' является потенциальным источником путаницы. Вместо этого попробуйте что-то вроде '#define strequal (x, y) (strcmp ((x), (y)) == 0)', а затем 'if (strequal (x, y) == true)' ... –

ответ

6

Причина этого - ваш вызов strrev(). Функция strrev() работает на месте. Другими словами, strrev работает в одном и том же буфере (т. Е. StrArr array) в качестве исходного массива и не выделяет новое пространство для инвертированной строки. В результате, как только вы вызываете strrev() с strArr, строка в strArr меняется на противоположную, и все, что вы делаете, сравнивает две идентичные строки: одну в strArr и снова в strArr, обе из которых теперь наоборот. (Обратите внимание, что оба эти параметра могут вводить в заблуждение. На самом деле существует только один буфер, и оба аргумента для strcmp указывают на это.)

Один из способов исправить эту проблему состоит в том, чтобы выделить второй массив strArr2 и скопировать строку внутрь. Затем измените строку в strArr2 и вызовите strcmp с strArr и strArr2. Ниже показано, как это решение будет выглядеть в коде.

... 
    char strArr2[MAX_LENGTH]; 
    ... 
    strcpy(strArr2, strArr); 
    strrev(strArr2); 
    int pali = strcmp(strArr , strArr2); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    ... 

Обратите внимание, что вы можете также проверить конец strArr для любых задних пробельных символов, из-за ваш конкретный метод принятия вклада. Любой такой конечный символ пробела может сделать ваш поворот и сравнение стратегии бесполезной, воздействуя на результат сравнения.

Если у вас недостаточно места или MAX_SPACE слишком велико, другим способом будет использование пользовательской функции сравнения для проверки того, является ли строка палиндром без использования strcmp или strrev.

+0

Ударьте меня на 10 секунд. Ешьте upvote! – DeiDei

+0

@ilim все еще не работает, теперь он печатает только _Not Palindrom_. Ive попытался напечатать две строки, и он печатает ее с тремя строками интервала между ними, хотя im не использует \ n вообще. – spyc

+0

@ilim в любом случае, чтобы этот код работал, когда пользователь вводит пробел? – spyc

2
int pali = strcmp(strArr , strrev(strArr)); 

Эта строка, очевидно, является проблемой.

Вызов strrev(strArr) меняет strArr так потом, когда strcmp называется, вы ожидаете strArr быть разными? Но это одна и та же переменная ...

Вы должны создать другой массив char, чтобы сохранить обратную строку.

EDIT:

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

#define MAX_LENGTH 100 

int main(void) 
{ 
    char str[MAX_LENGTH]; 
    char rev[MAX_LENGTH]; 

    puts("Enter string (max length 100 chars): "); 
    scanf("%s", str); 

    strcpy(rev, str); 
    strrev(rev); 

    if(strcmp(str, rev) == 0) { 
     puts("Palindrom"); 
    } else { 
     puts("Not Palindrom"); 
    } 
} 
+0

вот так? \t 'strcpy (strArrRev, strArr); strrev (strArrRev); int pali = strcmp (strArr, strArrRev);' – spyc

+0

@spyc Это выглядит отлично на первый взгляд, да. – DeiDei

+0

, когда он скомпилирован с изменением, он никогда не отображается как палиндром, и когда я печатаю два, они появляются с тремя линиями пробела между и как в abc cba. но когда я делаю ааббаа, он показывает ааббау, и он все еще пишет, что это не пали. – spyc

-1

ив добавил

strArr[strcspn(strArr, "\n")] = 0; 

после

fgets(strArr , MAX_LENGTH , stdin); 

И это сработало, его основно переписывания (нуль) в конце. который испортил обратное, чтобы включить null (0) в начале строки. Спасибо всем.

Finsihed Код:

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

#define MAX_LENGTH 100 
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0. 
int main(void) 
{ 
    char strArr[MAX_LENGTH], strArrRev[MAX_LENGTH]; 
    printf("Enter string (max length 100 chars): "); 
    fgets(strArr , MAX_LENGTH , stdin); 
    strArr[strcspn(strArr, "\n")] = 0; 
    strcpy(strArrRev, strArr); 
    int pali = strcmp(strArr , strrev(strArrRev)); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    system("PAUSE"); 
    return 0; 
}