首页 > 解决方案 > 如何更改 if else 语句进行切换?

问题描述

我不明白/不知道如何将 if else 语句更改为带有 case 的 switch 语句。请帮忙!我只需要将 if else 语句更改为 switch,我的任务就完成了!它完全运行和运行!

这个 C 程序提供了一个 main 函数,它支持类似 bash 的历史功能;循环缓冲区的主要目的是向用户重复显示一个提示,每个提示分配一个从 1 开始的输入编号。输入到循环缓冲区的每一行都被存储,直到它被覆盖,缓冲区最多只允许 5 行存储的输入,FIFO(先进先出)。

给用户 4 个命令选项: !x:x 表示选择的行号,感叹号(“!”)表示重复(绝对)输入行号 x。这仅在此行是保存的命令之一时才有效。此命令将显示原始输入行以及存储副本。如果参数 x 无效,将显示错误消息。

exit(区分大小写):终止程序。

历史(区分大小写):打印保存的命令

解析(区分大小写):标记输入行号 x,此输入行不应存储在缓冲区中,而是将每个单词显示在单独的行上。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CIRCULAR_HISTORY_BUFFER 5 
#define CHARACTER_LENGTH 128

void CircularHistoryBuffer()
{
char memory[CIRCULAR_HISTORY_BUFFER][CHARACTER_LENGTH];
char command_line[CHARACTER_LENGTH];
int data, n, i;
int number = 0; 
while(1) 
{
    printf("%d>", number + 1);

    fgets(command_line, CHARACTER_LENGTH - 1, stdin);
    for(i = 0; i < CHARACTER_LENGTH; i++)
    {
        if(command_line[i] == '\n')
        {
            command_line[i] = '\0';
            break;
        }
    }
    if(command_line[0] == '!')
    {
        n = atoi(command_line + 1);
     if(n < number - CIRCULAR_HISTORY_BUFFER + 1 || n > number || n <= 0)
        {
            printf( "%d: Not found\n", n);
        }
        else
        {
            data = (n - 1) % CIRCULAR_HISTORY_BUFFER;
            printf("%s\n", memory[data]);
            strcpy(memory[number % CIRCULAR_HISTORY_BUFFER], memory[data]);
            number++;
        }
    }
    else if(strcmp(command_line, "exit") == 0)
    {
        exit(0);
    }
    else if(strcmp(command_line, "history") == 0)
    {
        if(number <= CIRCULAR_HISTORY_BUFFER)
        {
            for(i = 0; i < number; i++)
            {
                printf("%d\t%s\n", i + 1, memory[i]);
            }
        }
        else 
        {
            n = number - CIRCULAR_HISTORY_BUFFER + 1;
            data = number % CIRCULAR_HISTORY_BUFFER;
            for(i = data; i < CIRCULAR_HISTORY_BUFFER; i++)
            {
                printf("%d\t%s\n", n++, memory[i]);
            }
            for(i = 0; i < data; i++)
            {
                printf("%d\t%s\n", n++, memory[i]);
            }
        }
    }
    else if(strncmp(command_line, "parse", 5) == 0)
    {
        n = atoi(command_line + 5);
     if(n < number - CIRCULAR_HISTORY_BUFFER + 1 || n > number || n <= 0)
        {
            printf("%d: event not found\n", n);
        }
        else
        {
            data = (n - 1) % CIRCULAR_HISTORY_BUFFER;
            for(i = 0; i < strlen(memory[data]); i++)
            {
                if(memory[data][i] == ' ')
                {
                    printf("\n");
                }
                else
                {
                    printf("%c", memory[data][i]);
                }
            }
            printf("\n");
        }
    }
    else
    {
        strcpy(memory[number % CIRCULAR_HISTORY_BUFFER], command_line);
        number++;
    }
  }
 }

int main()
{
  CircularHistoryBuffer();

return 0;
}

标签: c

解决方案


在这种情况下,使用 switch 语句没有多大意义,因为您正在查看进行多个字符串比较。

您可以做的是基于按字母顺序排序的表格进行表格查找:

const char* STR_TABLE[] =  // must be sorted in alphabetic order
{
  "exit",
  "history",
  "parse",
  ...
};

const size_t STR_TABLE_SIZE = sizeof(STR_TABLE) / sizeof(STR_TABLE[0]);

然后,您可以在表中搜索正确的字符串。天真的实现是一个 for 循环:

for(size_t i=0; i<STR_TABLE_SIZE; i++)
{
  if(strcmp(STR_TABLE[i], user_input)==0)
  {
    // found, do something
    break;
  }
}

当表中的字符串数量有限时,这是最佳选择。对于较大的表,您将使用二进制搜索。像这样的东西:

int strcmp_wrapper (const void* obj1, const void* obj2)
{
  return strcmp(obj1, *(const char**)obj2);
}

const char** result = bsearch(user_input, 
                              STR_TABLE,
                              STR_TABLE_SIZE,
                              sizeof(const char*),
                              strcmp_wrapper);

if(result != NULL)
{
  printf("User picked option %s at index %d.", *result, (int)(result - STR_TABLE));
}                               

推荐阅读