检查字符串是否为回文 - 当我编译程序时关闭

时间:2017-02-18 00:45:07

标签: c

我正在尝试编写一个C程序,它吃掉一个先验有界长度的字符串,如果它是回文,则返回1,否则返回0。我们可以假设输入由小写字母组成。

这是编程的第一门课程的一部分,所以我没有经验。

这是我的尝试。一旦我尝试在CodeBlocks上构建/运行它,程序就会关闭。这很遗憾,因为我觉得我做得很好。

#include <stdio.h>
#define MaxLength 50

int palindrome(char *a,int size) /* checks if palindrome or not */
{
    int c=0;
    for(int i=0;i<size/2;i++) /* for every spot up to the middle */
        {
            if (*(a+i)!=*(a+size-i-1)) /* the palindrome symmetry condition */
            {
                c++;
            }
        }

    if (c==0)
    {
        return 1; /*is palindrome*/
    }
    else
        return 0; /*is not palindrome*/
}

int main()
{
char A[MaxLength]; /*array to contain the string*/
char *a=&A[0]; /*pointer to the array*/
int i=0; /*will count the length of the string*/
int temp;
    while ((temp=getchar())!='\n' && temp != EOF) /*loop to read input into the array*/
    {
        A[i]=temp;
        i++;
    }
if (palindrome(a,i)==1)
    printf("1");
else
    printf("0");
return 0;
}

备注。我现在要睡觉了,所以几个小时后我都没有回应。

2 个答案:

答案 0 :(得分:2)

该指令

#define MaxLength=50

无效。应该有

#define MaxLength 50

以下列方式更改主循环

int temp;
^^^
while ( i < MaxLength && ( temp = getchar () )!= EOF && temp != '\n' )
{
    A[i] = temp;
    i++;
}

否则,如果要使用原始循环,则必须使用alt键和数字键盘将零值直接放入缓冲区。

函数本身可以写得更简单

int palindrome( const char *a, int size) /* checks if palindrome or not */
{
    int i = 0;

    while ( i < size / 2 && *( a + i ) == *( a + size - i - 1 ) ) ++i;         {

    return i == size / 2;
}

答案 1 :(得分:2)

虽然你有很多小错误,但你的方法还可以。首先,#define MaxLength=50应为#define MaxLength 50(要替换的文本,空格,然后替换它)。

您还应该在palindrome()之前为main()功能提供原型:

int palindrome(char *a,int size);

...或者只将整个palindrome()函数移到main()之上。在对函数的任何调用发生之前,应该出现原型或实际函数定义。

下一个问题是你在输入字符串的末尾寻找一个空字符。 C字符串通常是空终止的,但是来自控制台的行不是(如果它的终结符,它会在程序决定结束字符串时添加它) - 你应该检查一下相反换行(理想情况下,也适用于错误)。而不是

while ((temp=getchar())!='\0')

while ((temp=getchar())!='\n' && temp != EOF)

当您在main()打印结果时,最后应该有一个换行符,例如。 printf("1\n");而不是printf("1");,以确保输出缓冲区被刷新,以便您可以看到输出以及结束该输出行。

然后在你的palindrome()函数中,你的for循环sytax是错误的 - 这三个部分应该用分号分隔,而不是用逗号分隔。所以改变:

for(int i=0,i<size/2,i++)

...为:

for(int i=0; i<size/2; i++)

你还有一个额外的闭合支撑用于要移除的循环体。

解决了所有问题之后,它似乎有效......