使用fscanf读取未知数量的命令

时间:2015-11-17 18:50:54

标签: c

我正在从文件描述符(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是“移动”,否则我不能这样做。有没有办法可以获取命令字符串,检查“移动”然后获取整数?

3 个答案:

答案 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()获取一行命令,然后再解析它。