-1

我使用箭头键作为输入来在菜单printf上下移动箭头(“==>”) 。printf

我正在使用一个函数来计算箭头应该在哪里,用switch例和printf("\n==>")箭头应该在哪里,但它也会在新行中打印菜单。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>

void menu(void);
int arrowPos(void);

int main(void)
{
    int aDet, aDet2;
    int aCnt;

    for(;;)
    {
        aDet = getch();
        aDet2 = 0;
        if(aDet == 0xE0)
        {
            aDet2 = getch();
            if(aDet2 == 80) arrowPos();
        }
    }
    return 0;
}

int arrowPos(void)
{
    int aCnt;

LOOP:
    aCnt++;

    switch(aCnt)
    {
    case 1:
        system("cls");
        printf("==>");
        //  menu();
        break;
    case 2:
        system("cls");
        printf("\n==>");
        break;
    case 3:
        system("cls");
        printf("\n\n==>");
        //  menu();
        break;
    case 4:
        aCnt = 0;
        goto LOOP;
        break;
    }

    menu();
    //printf("%d",aCnt);
}

void menu(void)
{
    printf("Option 1\n");
    printf("Option 2\n");
    printf("Option 3");
}

当它在第二个和第三个箭头上打印菜单时,菜单也会打印在新行上。

而不是看起来像

 Option1
 Option2
 ==>Option3

看起来像

 ==>Option1
 Option2
 Option3
4

2 回答 2

1

我认为最干净的方法是包含选项的数组。在遍历数组时,您可以在正确的索引处打印箭头。

#define OPTION_CNT 3
const char *option_texts[OPTION_CNT] = {
    "Option 1",
    "Option 2",
    "Option 3"
};
const char * arrow_text = "==>";

void menu(size_t arrowIndex){
    for(size_t i = 0; i < OPTION_CNT; ++i){
        if(i == arrowIndex){
            printf("%s ", arrow_text);
        }
        printf("%s\n", option_texts[i]);
    }
}

如果您不能停止以 OO 方式思考,您还可以通过创建一个结构来扩展它,该结构不仅包含要显示的文本,还包含选择选项时调用的方法。

#define OPTION_CNT 3
typedef void OptionHandler();
struct Option {
    OptionHandler *handler;
    const char *text;
} options[OPTION_CNT] = {
    {doSomething1, "Option 1"},
    {doSomething2, "Option 2"},
    {doSomething3, "Option 3"}
}

那么你可以更换线路

printf("%s\n", option_texts[i]);

printf("%s\n", options[i].text);

当该选项被选中时,您只需

options[aCnt].handler();

因此,您将所有选项定义放在一个地方,并且您可以摆脱那些 switch 语句。

于 2019-08-05T16:41:14.307 回答
0

我建议不要尝试单独打印箭头和选项文本,而是将它们结合起来。

例子:

/* ... */
if(aCnt > 3)
{
   aCnt = 1;

   menu(aCnt)
}
/* ... */

static void menu(int aCnt)
{
   const char *arrow = "==>";
   const char *empty = "";

   /* this is not portable and should be replaced */
   system("cls");
   printf("%sOption 1\n", (aCnt == 1)?arrow:empty);
   printf("%sOption 2\n", (aCnt == 2)?arrow:empty);
   printf("%sOption 3", (aCnt == 3)?arrow:empty);

}
于 2019-08-05T16:01:36.970 回答