2015-11-12 2 views
-2

Я пишу код, чтобы проверить, является ли строка палиндром, но это дает мне ошибку времени выполнения. Я не могу определить, где ошибка. Пожалуйста помоги.Проверьте, является ли строка палиндром

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int main() 
{ 
    char a[20]; 
    int n,c; 
    c=0; 
    printf("enter the size of the string "); 
    scanf("%d",&n); 
    printf("enter the string "); 
    fgets(a,n,stdin); 

    for(int i=0;i<(n-1)/2;i++) 
    { 
     if(a[i]==a[n-1-i]) 
     { 
      c=0; 
     } 
     else 
     { 
      c=1; 
      break; 
     } 
    } 

    if(c==0) 
     printf("string is palindrome"); 
    else 
     printf("string is not palindrome"); 

    return 0; 
} 
+2

Возможный дубликат [палиндром программы в C] (http://stackoverflow.com/questions/34784096/palindrome-program-in-c) –

+0

Это более полезно, чтобы указать, что * * ошибки во время выполнения вы получите .. , –

ответ

1

Ну, первое, что я замечаю, при компиляции и выполнения этого является , что он не позволяет ввести строку. Это связано с тем, как вы принимая вход:

printf("enter the size of the string "); 
scanf("%d",&n); 
printf("enter the string "); 
fgets(a,n,stdin); 

Он работает scanf("%d",&n);. Таким образом, пользователь вводит, скажем, 6, а затем вводит ключ . Hokay, так scanf смотрит на этих персонажей 6\n, принимает 6, преобразуется в число, и n заканчивается значением 6.

Но это символ новой строки по-прежнему существует. scanf ничего не сделал с этим т.к. не число. Итак, когда код добирается сюда:

fgets(a,n,stdin); 

Затем он читает эту новость и думает: «Ладно! Пользователь ввел пустую строку . »(Да, я знаю, что я антропоморфен, подал в суд на меня.)

Такое поведение объясняется тем, что я избегаю использования scanf. Я бы закодировать это таким образом:

fgets(a, sizeof(a), stdin); 
n = atoi(a); 
printf("enter the string "); 
fgets(a, sizeof(a), stdin); 

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

На данный момент он работает правильно, поэтому я не буду вдаваться в остальную часть. Однако, если вы примете мой совет о вычислении длины , есть еще одна вещь, о которой нужно знать. Если добавить эту строку (временно, только для целей отладки):

printf("%d\n", strlen(a)); 

Вы увидите, что у вас есть еще один персонаж, чем вы ожидаете. То есть , потому что fgets сохраняет новую строку. Таким образом, мы хотим, чтобы избавиться от него:

a[strlen(a) - 1] = '\0'; 

Это не является необходимым, если вы используете значение n, потому что тогда это будет просто игнорировать символ новой строки и использовать n символы предшествующих. Но это необходимо, если вы вычисляете длину.

0

Взгляните на этот код, вот как я реализовал его (не забудьте #include <stdbool.h> или он не будет работать):

for(i = 0; i < string_length; i++) 
    { 
      if(sentence[i] == sentence[string_lenght-1-i]) 
        palindrome = true; 
      else 
      { 
        palindrome = false; 
        break; 
      } 
    } 

Делая что он будет проверять, если ваше предложение является палиндром и, на первый это неправда, он сломает цикл for. Вы можете использовать что-то вроде

if(palindrome) 
    printf(..); 
else 
    printf(..); 

для простого запроса для пользователя.

Пример:

радар палиндром

авва является палиндром

abcabc не палиндром

Пожалуйста, обратите внимание на то, что

Авва

не распознается как палиндром из-за того, что 'A' и 'а' имеют различные коды ASCII:

'А' имеет значение 65

' a 'имеет значение 97 согласно ASCII table. Вы можете узнать больше here.

Вы можете избежать этой проблемы, преобразуя все символы строки в символы нижнего регистра. Вы можете сделать это в том числе <ctype.h> библиотеку и вызова функции int tolower(int c); так:

for (; *p; ++p) *p = tolower(*p); 

или

for(int i = 0; str[i]; i++){ 
    str[i] = tolower(str[i]); 
} 

Код по Earlz, посмотрите на this Q&A смотреть глубже в это.

EDIT: Я сделал простую программу (однако это образец, он может быть оптимизирован и так далее, это просто дать вам идею), может ли он помочь вам

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

void LowerCharacters(char *word, int word_lenth); 

int main(void){ 

    char *word = (char *) malloc(10); 
    bool palindrome = false; 

    if(word == 0) 
    { 
     printf("\nERROR : Out of memory.\n\n"); 
     return 1; 
    } 

    printf("\nEnter a word to check if it is palindrome or not : "); 
    scanf("%s", word); 

    int word_length = strlen(word); 

    LowerCharacters(word,word_length); 

    for(int i = 0; i < word_length; i++) 
    { 
     if(word[i] == word[word_length-1-i]) 
      palindrome = true; 
     else 
     { 
      palindrome = false; 
      break; 
     } 
    } 

    palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word); 

    free(word); 

return 0; 

} 

void LowerCharacters(char *word, int word_length){ 

    for(int i = 0; i < word_length; i++) 
     word[i] = tolower(word[i]); 
} 

Вход:

Введите слово для проверки, если это палиндром или нет: РАДАР

Выход:

Слово радар - это палиндром.

Смежные вопросы