簡體   English   中英

使用fscanf讀取未知數量的命令

[英]Using fscanf to read an unknown number of commands

我正在從文件描述符(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是“ move”,否則我不能這樣做。 有沒有一種方法可以獲取命令字符串,檢查“ move”,然后獲取整數?

您當然可以做到。 訣竅是等到您知道要處理的命令類型為止。

在代碼中的某些時候,程序需要執行以下操作:

if (strcmp(cmd, "move") == 0) {
    ...
}

這是閱讀move命令的可選參數的好地方:

fscanf( fp, "%d%d", &row, &col );

注意:無論您分配多少緩沖區,使用%s都是不安全的。 您應該始終為命令緩沖區准備接受的字符數指定一個限制,如下所示:

fscanf( fp, "%20s", cmd )
//            ^^

您不能像上面概述的那樣輕松地完成此操作,但是您可以執行以下操作:

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();

如果您在編寫代碼時都知道需要支持的命令,那么這比讀取命令,整理出您擁有的命令,然后讀取適合該命令的參數要容易/簡單。

相反,例如,如果您可能具有某種插件,這些插件添加了要支持的新命令,那么您可能希望讀取該命令,並對照已安裝的命令的某些集合(例如,哈希表)對其進行檢查並使用以查找如何處理該命令(例如,至少找到一個數字,該數字表示要為該命令讀取的參數的數量,以及將這些參數傳遞給其進行處理的功能)。

while循環主體中:

if(strcmp(cmd, "move") == 0) {
    fscanf(fp, "%d%d", &row, &col);
}

請注意,由於命令長於20個字符,緩沖區溢出將導致事實,因此您現在編寫的代碼並不安全。 您可能希望使用"%20s"作為格式字符串來限制命令的長度。

或者,您可以使用fgets()獲取命令行,然后對其進行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM