C语言中如何比较char数组和char
How to Compare char array with char in C language
下面的代码有什么问题?
我陷入了 do while 循环。我比较字符错误吗?我也尝试使用 scanf("%c", &answer);
但结果相同
char answer[10];
for (i = 0; i < wish; i++)
{
/* ... */
/* ... */
do
{
printf(" Does this item have financing options? [y/n]:");
scanf("%s", &answer[i]);
if ((answer[i] != 'y' )|| (answer[i] != 'n'))
{
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}
} while ((answer[i] != 'y') || (answer[i] != 'n'));
您陷入了循环,因为继续循环的条件始终为真。
如果您看不懂,请尝试命名既不与“y”不同也不与“n”不同的字母。
以“a”为例,两者都不同。
以“n”为例,它与“n”没有区别,但与“y”不同。
以“y”为例,它与“n”不同,但与“y”没有区别。
因此,无论收到什么字母,循环都会继续。
要解决,请使用 Chris 的评论并更改为
((answer[i] != 'y' ) && (answer[i] != 'n'))
这样,除“n”或“y”之外的任何其他字母都将不同于“n”且不同于“y”,并且将继续循环,而“y”和“n”都将是与两者中的至少一个不同并结束循环。
一旦条件正确,它可能只需要一次,即只在循环中。额外的 if
是不需要的,至少在显示的代码中是这样。除了此处显示的内容之外,您可能还有需要它的代码。
在@Yunnosch 的出色回答的基础上,我们可以通过另一种方式来查看检查某些内容是否不是一组字符的逻辑。
我们可以把它看作是检查一个字符是否不是 'y'
和 不是 'n'
:
answer[i] != 'y' && answer[i] != 'n'
或... 我们可以检查它 是 'y'
还是 'n'
:
answer[i] == 'y' || answer[i] == 'n'
那就直接否定吧!
!(answer[i] == 'y' || answer[i] == 'n')
另一个选择
另一种查看方式,因为 char
是数字类型,所以可以使用开关。
switch (answer[i]) {
case 'y':
case 'n':
/* Do whatever happens when there is a valid input */
break;
default:
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}
在这里使用 switch 的唯一真正好处是它使得检查大写 y 和 n 之类的东西变得非常容易:
switch (answer[i]) {
case 'y': case 'Y':
case 'n': case 'N':
/* Do whatever happens when there is a valid input */
break;
default:
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}
下面的代码有什么问题?
我陷入了 do while 循环。我比较字符错误吗?我也尝试使用 scanf("%c", &answer);
但结果相同
char answer[10];
for (i = 0; i < wish; i++)
{
/* ... */
/* ... */
do
{
printf(" Does this item have financing options? [y/n]:");
scanf("%s", &answer[i]);
if ((answer[i] != 'y' )|| (answer[i] != 'n'))
{
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}
} while ((answer[i] != 'y') || (answer[i] != 'n'));
您陷入了循环,因为继续循环的条件始终为真。
如果您看不懂,请尝试命名既不与“y”不同也不与“n”不同的字母。
以“a”为例,两者都不同。
以“n”为例,它与“n”没有区别,但与“y”不同。
以“y”为例,它与“n”不同,但与“y”没有区别。
因此,无论收到什么字母,循环都会继续。
要解决,请使用 Chris 的评论并更改为
((answer[i] != 'y' ) && (answer[i] != 'n'))
这样,除“n”或“y”之外的任何其他字母都将不同于“n”且不同于“y”,并且将继续循环,而“y”和“n”都将是与两者中的至少一个不同并结束循环。
一旦条件正确,它可能只需要一次,即只在循环中。额外的 if
是不需要的,至少在显示的代码中是这样。除了此处显示的内容之外,您可能还有需要它的代码。
在@Yunnosch 的出色回答的基础上,我们可以通过另一种方式来查看检查某些内容是否不是一组字符的逻辑。
我们可以把它看作是检查一个字符是否不是 'y'
和 不是 'n'
:
answer[i] != 'y' && answer[i] != 'n'
或... 我们可以检查它 是 'y'
还是 'n'
:
answer[i] == 'y' || answer[i] == 'n'
那就直接否定吧!
!(answer[i] == 'y' || answer[i] == 'n')
另一个选择
另一种查看方式,因为 char
是数字类型,所以可以使用开关。
switch (answer[i]) {
case 'y':
case 'n':
/* Do whatever happens when there is a valid input */
break;
default:
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}
在这里使用 switch 的唯一真正好处是它使得检查大写 y 和 n 之类的东西变得非常容易:
switch (answer[i]) {
case 'y': case 'Y':
case 'n': case 'N':
/* Do whatever happens when there is a valid input */
break;
default:
printf("\nERROR: Must be a lowercase 'y' or 'n'");
}