[英]How to change if else statement to switch?
我不明白/不知道如何将 if else 语句更改为带有 case 的 switch 语句。 请帮忙! 我只需要将 if else 语句更改为 switch,我的任务就完成了! 它完全运行和运作!
这个 C 程序提供了一个支持类似 bash 的历史功能的 main 函数; 循环缓冲区的主要目的是向用户重复显示一个提示,每个提示分配一个从1开始的输入编号。输入到循环缓冲区的每一行都被存储直到被覆盖,缓冲区最多只允许5行存储输入,FIFO(先进先出)。
为用户提供 4 个命令选项: !x:x 表示选定的行号,感叹号(“!”)表示重复(绝对)输入行编号 x。 这仅在此行是保存的命令之一时才有效。 此命令将显示原始输入行以及存储副本。 如果参数 x 无效,则会显示错误消息。
退出(区分大小写):终止程序。
历史记录(区分大小写):打印保存的命令
解析(区分大小写):标记输入行号 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;
}
在这种情况下,使用 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));
}
switch
-statement 仅适用于整数值。 有switch
语句使用:
switch(a) { case '1': doSomething(); break; // if you forget break operator, than second
switch(a) { case '1': doSomething(); break; // if you forget break operator, than second
情况also will invoke and so one case '2': doSomethingElse(); break; default: doSomethingElse2(); }
also will invoke and so one case '2': doSomethingElse(); break; default: doSomethingElse2(); }
如果您需要使用特定范围内的整数值/常量,您可以使用switch
-statement。
目前你的代码是这样的:
if(command_line[0] == '!') { <recall> } else if(strcmp(command_line, "exit") == 0) { <exit> } else if(strcmp(command_line, "history") == 0) { <historic> } else if(strncmp(command_line, "parse", 5) == 0) { <parse> } else { <other> }
使用开关会给出类似的东西:
switch (command_line[0]) {
case '!':
<recall>
break;
case 'e':
if(strcmp(command_line + 1, "xit") == 0)
{
<exit>
}
else
{
<other>
}
break
case 'h':
if(strcmp(command_line + 1, "istory") == 0)
{
<historic>
}
else
{
<other>
}
break
case 'p':
if(strncmp(command_line + 1, "arse", 4) == 0)
{
<parse>
break;
}
// no fallthrough
default:
{
<other>
}
}
这不太可读,如果必须修改,则有助于引入错误,并且如果这是您所期望的,则对速度没有任何好处
对我来说不要那样做......但在一种情况下问问自己strcmp但strncmp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.