C-在添加额外步骤时执行

C-在添加额外步骤时执行,c,io,do-while,getchar,C,Io,Do While,Getchar,当我运行下面的代码时,它会正确执行,但在我再次输入之前会添加额外的迭代。不知道为什么。我将把它用于子对象的fork和pipe父进程。该步骤将在用户输入流程之后进行 代码: 想想当你第一次输入时会发生什么。键入3,然后按Enter键 现在,在标准输入缓冲区中,有两项等待使用,3和\n(输入) 第一次进入循环体时,消耗3。现在,下一行等待\n 当您再次进入循环体(第二次)时,标准输入缓冲区要读取的下一个字符是\n,这就是第二个getchar()高兴地返回给您的字符 下面是一个快速解决方案: do {

当我运行下面的代码时,它会正确执行,但在我再次输入之前会添加额外的迭代。不知道为什么。我将把它用于子对象的fork和pipe父进程。该步骤将在用户输入流程之后进行

代码:


想想当你第一次输入时会发生什么。键入3,然后按Enter键

现在,在标准输入缓冲区中,有两项等待使用,
3
\n
(输入)

第一次进入循环体时,消耗3。现在,下一行等待
\n

当您再次进入循环体(第二次)时,标准输入缓冲区要读取的下一个字符是
\n
,这就是第二个
getchar()
高兴地返回给您的字符

下面是一个快速解决方案:

do {
    printf ("How many processes do you want? (1, 2 or 4) \n");
    // Eat trailing newline character, if any
    do {
      num_processes = getchar();      // read a character
    } while(num_processes == '\n');   // if it was the newline character, repeat
                                      // until `num_processes` is not the newline character

    // Continue with your logic..
    num_processes -= '0';
输出:

How many processes do you want? (1, 2 or 4) 
3
Invalid Input, please try again.
How many processes do you want? (1, 2 or 4) 
2

1 Parent and 1 child processes
----------------------------------

PS:正如@Barmar所评论的,如果你想读行,那么使用。阅读此处的更多信息:

getchar()
的第二次调用返回一个换行符。如果要读取行,请使用
fgets()
,而不是
getchar()
。我将修复代码以使用fgets()。我不知道这样更好。谢谢@特拉维斯:不客气,我喜欢你的热情,所以我用这个编辑了我的问题,它展示了你在使用
fgets()
时的相同行为。一定要去看看!你是最棒的!我感谢你的信息!再次感谢@格萨马拉斯
do {
    printf ("How many processes do you want? (1, 2 or 4) \n");
    // Eat trailing newline character, if any
    do {
      num_processes = getchar();      // read a character
    } while(num_processes == '\n');   // if it was the newline character, repeat
                                      // until `num_processes` is not the newline character

    // Continue with your logic..
    num_processes -= '0';
How many processes do you want? (1, 2 or 4) 
3
Invalid Input, please try again.
How many processes do you want? (1, 2 or 4) 
2

1 Parent and 1 child processes
----------------------------------