我正在尝试在程序内部添加一个while循环。执行后,应该询问您是否要继续,如果要继续,请键入“ y”,否则请键入“ n”。如果他们这样做,应该重新开始,否则就停止。
问题是,如果有人键入“ y”或“ n”以外的内容来要求他们这样做,那么我想弹出一条消息。问题是while循环将继续进行,无论他们写什么。
char cnd[100];
while(cnd[0] != 'n') {
printf("Program executing\n");
printf("Would you like to launch the program again? If not then type in 'n', if you do then type in 'y': ");
scanf("%s", &cnd);
while(cnd[0] != 'n' || cnd[0] != 'y') {
printf("You have to type in either 'y' or 'n':");
scanf("%s", &cnd);
}
}
return 0;
我甚至试图通过在语句前后打印用户输入来测试这一点。这似乎是正确的,所以我不知道while循环为什么不起作用。
答案 0 :(得分:1)
让我们将循环条件翻译成简单的英语:
cnd[0] != 'n' || cnd[0] != 'y'
基本上,您是在说:
如果
cnd
中的第一个字符不是n
,或者或cnd
中的第一个字符不是y
,进入循环。
这是不可证伪的,因为cnd[0]
总是不是n
或不是y
-不能同时存在。
您应该问:
如果
cnd
中的第一个字符不是n
,并且cnd
中的第一个字符不是y
,进入循环。
答案 1 :(得分:1)
您的while循环检查是否为y或n始终为真,请尝试执行此操作
while(cnd[0] != 'n' && cnd[0] != 'y') {
答案 2 :(得分:1)
条件cnd[0] != 'n' || cnd[0] != 'y'
始终为 。您打算使用&&
(逻辑和)。
您还需要从&
中删除&cnd
(在两个scanf
调用中),因为这会导致格式说明符不匹配。
在第一次迭代中,cnd
尚未初始化。最好使用do ..while
循环,或以{y {1}}开始cnd
,例如:char cnd[100] = "y";
答案 3 :(得分:1)
阅读您写的内容(以代码而非英语)
while(cnd[0] != 'n' || cnd[0] != 'y') {
如果cnd [0] ='n',则它不等于'y',反之亦然。
你的意思
while(cnd[0] != 'n' && cnd[0] != 'y') {
ie给出的错误是其非n和非y
答案 4 :(得分:0)
首要的是:为什么想要一个字符时要读一个字符串?使用getchar()。然后检查流中该字符之后是否还有其他垃圾并采取相应措施:错误消息,清除标准输入:
#include <stdbool.h>
#include <ctype.h>
#include <stdio.h>
void clear(FILE *stream)
{
int ch;
// eat everything until a newline or EOF is encountered:
while ((ch = fgetc(stream)) != EOF && ch != '\n');
}
bool only_whitespace(FILE *stream)
{
int ch;
// eat all whitespace until a newline or EOF is encountered:
while ((ch = fgetc(stream)) != EOF && isspace((char unsigned)ch) && ch != '\n');
// ^^^^^^^^^^^^^^ don't pass signed values
// to the functions from <ctype.h>
if (ch == '\n') { // when the last character read was a newline
ungetc(ch, stream); // put it back into the stream
return true; // and tell the caller that all we encountered
} // was whitespace
return false;
}
int main(void)
{
int again;
do {
puts("Program executing\n");
while (printf("Would you like to launch the program again? If not then type in 'n', if you do then type in 'y': "),
(again = getchar()) != EOF && again != 'y' && again != 'n' || !only_whitespace(stdin))
{
fputs("Input error!\n\n", stderr);
if (again != '\n') // when the character read was not a newline
clear(stdin); // there could be other garbage left in the stream
}
clear(stdin);
} while (again == 'y');
// return 0; // Since C99 (i think) the effect of execution reching the end of main() without
// encountering a return-statement is the same as return 0; (same in C++)
}