为什么第二次循环时不等用户输入就跳到go out


#include <stdio.h>
int main(void)
{
    char c1;
    for(;;){
        printf("继续输入:");
        scanf("%c", &c1);
        if(c1!='Y') break;
        printf("go on\n");
    }
    printf("go out\n");
    return 0;
 } 

为什么第二次循环时不等用户输入就跳到go out

因为前一次输入之后的换行 , 被下一次接收了,所以 没有输入, 判断不等于 Y ,直接退出了

【以下回答由 GPT 生成】

问题的原因在于使用 fmt.Scanf("%c", &c1) 函数时,它会读取用户输入字符串中的一个字符,并将其赋值给变量 c1。但是 fmt.Scanf 函数会将用户输入字符串中的换行符\n 也作为一个字符读取,导致程序在第二次循环时直接读取到换行符 \n,而不是等待用户输入。

为了解决这个问题,我们可以改用 bufio.NewReader(os.Stdin).ReadString('\n') 函数来读取用户输入的一行字符串,然后判断这行字符串的第一个字符是否为 'Y'。

以下是修复后的代码示例:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print("继续输入:")
        input, _ := reader.ReadString('\n')
        if input[0] != 'Y' {
            break
        }
        fmt.Println("go on")
    }
    fmt.Println("go out")
}

现在,程序会等待用户输入一行字符串,并将字符串的第一个字符与 'Y' 进行比较。如果不为 'Y',则跳出循环并打印 "go out"。如果为 'Y',则继续循环并打印 "go on"。

这样就解决了第二次循环时不等待用户输入而直接跳出循环的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^