2011-04-17 97 views
0

我需要解析从CMD,看起来像这样如何在c中输入一个完整的行输入?

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

由于空格的数量可能会有所不同,我没有得到正确的值。我怎样才能标记输入行?

+0

你是否将''SOME WHITE SPACE'“var_name”“SOME WHITE SPACE”“var_value”“SOME WHITE SPACE”'作为命令行参数?没有得到这个问题。 – Sadique 2011-04-17 14:28:31

+0

不 - 我正在循环用户在命令行中键入的许多值 - 这不是一个参数。谢谢 – aaaa 2011-04-17 14:30:45

回答

1

从scanf系列聚合所有功能,默认情况下跳过多个空白字符:

sscanf(input_buf," %s %s", var_buff, var_val_buf); 

我不知道在格式字符串中的前导空格是绝对必要的,但我肯定这是正确的事件如果在输入行的开头没有实际的空格。

2

使用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 
0

这似乎自然地用strtok()strtok_r()这里。你为什么决定反对它?

相关问题