2015-12-12 2 views
0
int isPalindrome(char *str) 
{ 
    static int length = strlen(str); 
    if (length < 1) 
     return 1; 
    if (str[0] == str[length - 1]) 
    { 
     length -= 2; 
     return isPalindrome(str + 1); 
    } 
    else return 0; 
} 

int main() { 
    char word[25]; 
    printf("Please enter a word: "); 
    scanf("%s", word); 
    if (isPalindrome(word)) 
     printf("%s is Palindrome", word); 
    else 
     printf("%s isn't Palindrome", word); 
    return 0; 
} 

после того, как я запустил этот код. у него есть ошибка ERROR: Initializer is not a constant. на этой линии. Что мне делать?ОШИБКА: Инициализатор не является постоянным

static int length = strlen(str); 

Функция должна иметь 1 аргумент (строка ввода) ==> isPalindrome (символ * Str)

+0

Сделайте внутреннюю версию 'isPalindrome', которая имеет' length' в качестве параметра, так что вам не понадобится статический int , Старайтесь избегать использования статики. – wimh

+1

'static int length = strlen (str);' -> 'int length = strlen (str);' также 'length - = 2;' then copy & update EOS (End Of String) – BLUEPIXY

+0

Мне нужен 1 аргумент в функции int isPalindrome (char * str) –

ответ

1

Любой объект со статической продолжительностью хранения может быть инициализирована только с постоянными выражениями. strlen(str) не является постоянным выражением.

§ 6.7.9, Initialization

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

Вместо этого, вы можете удалить static классификатор и переписать логику просто с помощью дополнительных переменных:

int isPalindrome(char *str, size_t st, size_t end) 
{ 
    if (st >= end) return 1; 
    return (str[st] == str[end]) && isPalindrome(str, st+1, end-1); 
} 

и называют:

if (isPalindrome(word, 0, strlen(word) - 1)) 

В существующей реализации, вам необходимо изменить терминатор NUL и удалить static:

int isPalindrome(char *str) 
{ 
    int length = strlen(str); 
    if (length < 1) 
     return 1; 
    if (str[0] == str[length - 1]) 
    { 
     str[length - 1] = '\0'; 
     length -= 2; 
     return isPalindrome(str + 1); 
    } 
    else return 0; 
} 

Сделайте копию word и передать его:

char temp[25]; 
    strcpy(temp, word); 
    if (isPalindrome(temp)) { 
+0

Спасибо за ответ. , но я хочу 1 аргумент (строка ввода) в функции. int isPalindrome (char * str) –

+0

@ArayaSiriadun Можете ли вы использовать цикл вместо рекурсии? –

+0

Нет. Я не могу использовать. T^T –

1

static представляет собой как глобальную переменную. Вы не можете назначить динамическое значение глобальной переменной. Вы можете назначить постоянное значение глобальной переменной.

Так что попробуйте это,

static int length; 
length = strlen(str); 

Тогда в вашем случае, вам не нужно, чтобы сделать эту переменную как static.

Edited Код

int isPalindrome(char *str) 
{ 
    int length = strlen(str); 
    while(1){ 
      if (length < 1) 
        return 1; 
      if (str[0] == str[length - 1]) 
      { 
       length -= 2; 
       str+=1; 
      } 
      else return 0; 
    } 
} 


int main() { 
    char word[25]; 
    printf("Please enter a word: "); 
    scanf("%s", word); 

    if (isPalindrome(word)) 
     printf("%s is Palindrome", word); 
    else 
     printf("%s isn't Palindrome", word); 
    return 0; 
}            
+0

Я пробую это работа. но, выход неправильный. Что мне делать? –

+1

Этот код - это работа. но Извините, я забыл вам сказать. Я не позволю редактировать основную функцию –

+0

@ArayaSiriadun Попробуйте это. –

0
int isPalindrome(char *str) 
{ 
    int length = strlen(str); 
    if (length <= 1) 
     return 1; 
    if (str[0] == str[length - 1]) 
    { 
     str[length - 1] = '\0'; 
     length -= 2; 
     return isPalindrome(str + 1); 
    } 
    else return 0; 
} 

int main() { 
    char word[25]; 
    printf("Please enter a word: "); 
    scanf("%s", word); 
    if (isPalindrome(word)) 
     printf("%s is Palindrome\n", word); 
    else 
     printf("%s isn't Palindrome\n", word); 
    system("pause"); 
    return 0; 
} 

Этот код ХОРОШО. , но у него есть немного ошибка.

Please enter a word: abcba 
abc is Palindrome 

ответ правильный. , но строка неправильная (я не могу редактировать основную. Я могу редактировать только другие функции)

+0

Вы можете сделать копию в самой функции: http://ideone.com/SQRWZD –

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