如果不满足条件,则暂停while循环

时间:2019-01-07 21:08:33

标签: c while-loop

我正在尝试在程序内部添加一个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循环为什么不起作用。

5 个答案:

答案 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";

Note the problems with scanf too.

答案 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++)
}