我正在尝试编写一个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;
}
备注。我现在要睡觉了,所以几个小时后我都没有回应。
答案 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++)
你还有一个额外的闭合支撑用于要移除的循环体。
解决了所有问题之后,它似乎有效......