我正在从文件描述符(fp)中读取以从客户端到我的TCP服务器获取命令。获取命令的当前方式看起来像这样
char cmd[21];
while ( fscanf( fp, "%s", cmd ) == 1 && strcmp( cmd, "quit" ) != 0 ) {
//do work
}
我的问题是其中一个命令可以是“move”,后跟两个整数。我知道我可以做类似
的事情char cmd[21];
int row = 0;
int col = 0;
fscanf( fp, "%s%d%d", cmd, &row, &col );
但除非我知道cmd是“移动”,否则我不能这样做。有没有办法可以获取命令字符串,检查“移动”然后获取整数?
答案 0 :(得分:2)
你当然可以这样做。诀窍是等到你知道你正在处理什么样的命令。
在您的代码中的某个时刻,您的程序需要执行以下操作:
if (strcmp(cmd, "move") == 0) {
...
}
这是阅读move
命令的可选参数的好地方:
fscanf( fp, "%d%d", &row, &col );
注意:无论您分配多大的缓冲区,使用%s
都是不安全的。您应该始终为命令缓冲区准备接受的字符数指定限制,如下所示:
fscanf( fp, "%20s", cmd )
// ^^
答案 1 :(得分:1)
你不能像上面概述的那样轻松地完成它,但你可以做类似的事情:
if (2 == fscanf(fp, "move %d %d", &row, &col))
move(row, col);
// possibly similar checks for other commands here.
else if (fscanf(fp, "quit"))
quit();
如果在编写代码时需要支持的命令都是已知的,这比读取命令更简单/更简单,找出你拥有的命令,然后读取适合该命令的参数。
相反,如果您(例如)有某种插件可以添加要支持的新命令,那么您可能想要读取命令,针对某些已安装命令的集合(例如,哈希表)进行检查并使用它来查找如何处理该命令(例如,至少找到一个表示该命令要读取的参数数量的数字,以及传递这些参数进行处理的函数)。
答案 2 :(得分:0)
在while
循环体中:
if(strcmp(cmd, "move") == 0) {
fscanf(fp, "%d%d", &row, &col);
}
请注意,现在编写的代码不安全,因为如果命令长度超过20个字符,则会发生缓冲区溢出。您可能希望使用"%20s"
作为格式字符串来限制命令的长度。
或者,您可以使用fgets()
获取一行命令,然后再解析它。