【问题标题】:Loop when enter is scanf'ed like pacman像 pacman 一样扫描输入时循环
【发布时间】:2016-01-01 15:28:35
【问题描述】:

我正在尝试一会儿问一个问题,一会儿再确认,这基本上会在满足条件时重置第一个问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char Disque[] = "";

    char qDisque[] = "";

    system("clear");

    while (strcmp(qDisque, "y")) 
    {
        system("clear");

        printf("\nLetter for disk : \n");

        scanf("%s", Disque);

        while (strlen(Disque) > 1) 
        {        
            system("clear");

            printf("\nLetter for disk : \n");

            scanf("%s", Disque);
        }

        system("clear");

        printf("Use /dev/sd%s as install disk ? [y|n] : ", Disque);

        scanf("%s", qDisque);
    }
}

到目前为止一切顺利。除了我不能在要求确认时模仿 pacman -S $PKG 的行为:意思是如果我按 n 它将停止,但我可以按 ENTER 输入 o 或任何它将继续。

我的脚本只接受“任何击键”,但输入时只需添加空格,后面跟着 scanf()。

有没有不改变我的代码结构的解决方案(例如只改变条件或添加功能)?如果没有,我应该改变什么以使其模仿 pacman 行为?

我的程序的实际行为如下(解释):

Question ? :                      //ENTER keystroke
                                //ENTER keystroke
                                //ENTER keystroke
                                //ENTER keystroke
                                //ENTER keystroke
y                                 //y keystroke
Are you sure ?
                                //ENTER keystroke
                                //ENTER keystroke
                                //ENTER keystroke
n                                 //n keystroke
Okay no changes !

感谢男孩(和女孩)!

【问题讨论】:

    标签: c while-loop scanf archlinux


    【解决方案1】:
    char Disque[] = "";
    char qDisque[] = "";
    

    这两个数组只有一个字符 '\0' 而没有别的,所以大小是 1 。当您使用 scanf 输入它们时,'\0' 没有空间,并且将它们传递给字符串操作函数将导致 未定义的行为

    您需要在声明时提及它们的大小以消除问题。

    编辑-

    初始化 qDisque 之前,你将它与strcmp 中的"y" 进行比较-

    while (strcmp(qDisque, "y")) 
    

    因此,请使用 do-while 循环而不是此循环。

    如果你看到strcmp返回0,那么这个条件将为假,如果它返回1,那么条件将为真。

    所以do-while循环中的条件应该如下-

    do{
      ...
      //you code
      }while (strcmp(qDisque, "y")==0);
    

    所以,如果qDisque"y",那么只有循环会继续。

    【讨论】:

    • 我尝试添加 100 但它没有任何影响,gcc 通过但没有任何改变,相同的 ENTER 行为(添加烦人的空格)。
    • @Gradiuss 很抱歉,我无法理解。你介意举例说明输入和预期输出吗?
    • 我设法添加了一些行来直观地解释我的实际程序的确切行为。
    • @Gradiuss 我在回答中提到了一个编辑,请看一下。
    • 已经进行了更改,但仍然 ENTER 根本没有行为,只是添加了越来越多的空格,而不是执行循环或指令。我知道这只是代码过程中的一个细节,但我发现知道用户可以输入 ENTER 并看到添加的空格很烦人,这很难看...
    【解决方案2】:

    如果一次只需要一个驱动器号,您可以使用单个 char 而不是阵列:

    char Disque = 0;
    char qDisque = 'y';
    
    while(qDisque == 'y')
    // ...
    

    并在scanf() 中使用"%c"" %c"。如果是以前的\n,则需要额外的空间。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多