编写一个c程序,该程序将判断字符串是否是回文(两种读取方式相同),直到遇到BYE



一切都在我的代码中工作,但一旦用户输入"BYE"我的程序没有结束,我不知道为什么while循环没有响应那个代码

#include "stdio.h"
#include <string.h>
int main(void)
{
char ch[20];
while (ch != "bye")
{
scanf("%s", ch);
int i;
int n = strlen(ch);
int c = 0;

for (i = 0; i < n / 2; i++)
{
if (ch[i] == ch[n - i - 1])
c++;
}
if (c == i)
{
printf("1");
}
else
{
printf("0");
}
}
return 0;
}

对于初学者,数组ch没有初始化,即最初它不包含字符串

char ch[20];

其次,在while循环条件

while (ch != "bye")

比较了两个地址:数组ch的第一个元素的地址和字符串字面值"bye"的第一个元素的地址。由于数组和字符串字面值占用不同的内存区域,所以地址总是不相等的。因此,你得到了一个不包含break语句的无限循环。

如果要比较字符串,则需要使用标准字符串函数strcmp,例如

if ( strcmp( ch, "bye" ) == 0 )
{
//...
}

在这种情况下,数组ch应该已经包含了一个字符串。

因此,代替while语句,最好使用do-while语句或无限while语句,如果strcmp将返回0,则该语句将通过break语句中断。

例如

while ( 1 )
{
char ch[20];
scanf("%19s", ch );
if ( strcmp( ch, "bye" ) == 0 ) break;

size_t n = strlen(ch);
size_t i = 0;
while ( i < n / 2 && ch[i] == ch[n - i - 1] ) ++i;

if ( i == n / 2 )
{
printf("1");
}
else
{
printf("0");      }
}  
}

最新更新