我编写了一个简单的标记生成器,它将命令行拆分成单独的行,每行包含一个单词。我想... ...
如果命令行的第一个单词是"退出"
识别" Pickup"," Save"和" Go"等指令。然后编译器将查找下一个标记。
我的想法是使用带有大小写的简单开关来检查这些命令,但我无法弄清楚将它放在哪里。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char command[256];
int commandIndex;
char token[32];
int isWhiteSpace(char character) {
if (character == ' ') {
return 1;
}
else if(character == '\t') {
return 1;
}
else if(character < ' ') {
return 1;
}
else {
return 0;
}
} char* getToken() {
int index = 0; // Skip white spaces
while(commandIndex<256 && isWhiteSpace(command[commandIndex])) {
commandIndex ++;
} // If at end of line return empty token
if(commandIndex>=256) {
token[0] = 0;
return token;
} // Capture token
while(commandIndex<256 && !isWhiteSpace(command[commandIndex])) {
token[index] = command[commandIndex];
index++;
commandIndex ++;
}
token[index] = 0;
return token;
}
void main() {
printf("Zeta - Version 2.0\n");
while(1) {
printf("Command: ");
gets_s(command);
commandIndex = 0;
char* token = getToken();
while (strcmp(token,"") != 0) {
printf("%s\n", token);
token = getToken();
}
}
}
答案 0 :(得分:1)
对main中的循环进行一点重组就可以了。
int main() {
printf("Zeta - Version 2.0\n");
bool done = false;
while (!done) {
printf("Command: ");
gets_s(command);
commandIndex = 0;
char* token = getToken();
if (strcmp(token, "quit") == 0) {
done = true;
} else if (strcmp(token, "pickup") == 0) {
doPickup();
} else if (strcmp(token, "save") == 0) {
char * filename = getToken();
doSave(filename);
} ...
}
return 0;
}
您不能将switch语句与字符串一起使用,因此您只需使用一堆if ... else if ...
语句来检查每个命令。还有其他方法,但是这个方法需要对您已有的代码进行最少的更改。
在示例中,在"save"
的处理下,我展示了如何再次调用getToken
以在同一命令行上获取下一个标记。
(请注意,我还修复了main
的返回值。有些编译器会让您使用void
,但这不是标准的,所以如果你不这样做,那么它是最好的#&# 39; t那样做。)