繁体   English   中英

如何在C中标记全行输入?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM