错误:初始值设定项不是常量

时间:2015-12-12 10:19:36

标签: c

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个参数(输入字符串)==&gt; isPalindrome(char * str)

3 个答案:

答案 0 :(得分:1)

static就像一个全局变量。您无法将动态值分配给全局变量。您只能将常量值分配给全局变量。

所以试试这个,

static int length;
length = strlen(str);

然后在您的情况下,您不需要将该变量设为static

已编辑的代码

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;
 }                                            

答案 1 :(得分:1)

具有静态存储持续时间的任何对象只能使用常量表达式进行初始化。 strlen(str)不是一个常量表达式。

§6.7.9,初始化

  

初始化程序中具有静态或。的对象的所有表达式   线程存储持续时间应为常量表达式或字符串   文字。

相反,您可以删除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)) {

答案 2 :(得分: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;
}

这段代码是OKAY。 但它有一点点错误。

Please enter a word: abcba
abc is Palindrome

答案是对的。 但字符串不正确 (我无法编辑主要内容。我只能编辑其他功能)