[英]how to token a full line input in c?
我需要從cmd解析一條看起來像這樣的行
"SOME WHITE SPACE" "var_name" "SOME WHITE SPACE" "var_value" "SOME WHITE SPACE"
我把整個行與fgets:
fgets(input_buf,MAX_LINE_LENGTH,stdin);
並嘗試像這樣標記化:
sscanf(input_buf,"%s", var_buff);
sscanf(input_buf+strlen(var_buff),"%s", var_val_buff);
sscanf(input_buf+(strlen(var_buff)+strlen(var_val_buff)+2),"%s", rest_line_buff);
if (strlen(rest_line_buff) == 0)
printf("error in usage\n");
由於空格的數量可能會變化,因此我無法獲得正確的值。 如何標記輸入行?
使用strtok
,如下面的示例程序所示:
#include <stdio.h>
#include <string.h>
int main ()
{
char sampleInput[] ="foo bar foo1 bar1 foo2 bar2";
char *token;
char *whiteSpace = " \t\n\f\r\v";
int isVariable = 1;
token = strtok(sampleInput, whiteSpace);
while (token != NULL)
{
if (isVariable)
printf("Variable = %s\n", token);
else
printf("Value = %s\n\n", token);
isVariable = isVariable ? 0 : 1;
token = strtok(NULL, whiteSpace);
}
return 0;
}
輸出:
Variable = foo
Value = bar
Variable = foo1
Value = bar1
Variable = foo2
Value = bar2
scanf系列中的所有函數默認都會聚合並跳過多個空格字符:
sscanf(input_buf," %s %s", var_buff, var_val_buf);
我不確定格式字符串中的前導空格是否絕對必要,但是如果輸入行的開頭沒有實際的空格,我肯定這是正確的事件。
使用掃描儀生成器: http : //en.wikipedia.org/wiki/Lexical_analysis#Lexer_generator或下載令牌生成器庫。
在這里使用strtok( )
或strtok_r( )
很自然。 你為什么反對呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.