使用scanf读取格式化输入

时间:2015-07-12 10:07:00

标签: c scanf

我希望使用scanf从stdin中读取一些带有值的变量。输入格式如下:

MY_VARIABLE_BEGIN
var1 
var2
...
MY_VARIABLE_END
MY_VALUES_BEGIN
val1
val2
...
MY_VALUES_END 

输入由两部分组成:

第1部分:此部分由MY_VARIABLE_BEGIN,MY_VARIABLE_END

分隔的变量名称

第2部分:此部分的每个变量的值由MY_VALUES_BEGIN,MY_VALUES_BEGIN

分隔

问题在于我不知道变量的数量及其值。 任何正文都可以帮我找到传递给scanf函数的正确格式,或者是否有其他解决方案来解决问题?

输入示例

MY_VARIABLE_BEGIN
var1 
var2
MY_VARIABLE_END
MY_VALUES_BEGIN
1
5
MY_VALUES_END 

我应该阅读2个变量var1和var2,var1 = 1和var2 = 5

2 个答案:

答案 0 :(得分:0)

你可以试试这个

char line[256];
fgets(line, sizeof(line), stdin);
if (strcmp(line, "MY_VARIABLE_BEGIN") {
    do {
        fgets(line, sizeof(line), stdin);

        // . . . do something with the line

    } while (strcmp(line, "MY_VARIABLE_END"));
}

不确定它是否有效。

答案 1 :(得分:0)

scanf做这件事很痛苦。为什么不使用C 中的正则表达式? 这是一个完整的工作程序,以显示它是多么容易。 首先将所有数据读入单个字符串数据。我只是使用常数。 使用regcomp编译您的模式,然后将regexec应用于您的字符串。 它返回一组匹配的组,这些组对应于模式的(.*?)部分。 在这个例子中,组0没有意义,因为它只是整个数据。

对于其他2组,您将获得匹配开始和结束字符串中的索引。 使用strndup()复制这些内容。使用strtok在换行符dup字符上拆分\n。 每个点都有ptr个变量和值。

/* regex example. meuh on stackoverflow */
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

void pexit(char *str){
    extern int errno;
    perror(str);
    exit(errno);
}
#define NUMMATCH (1+2) /* max num matching capture groups in pattern */
main(int argc, char **argv){
    regex_t myexpn;
    regmatch_t matches[NUMMATCH] = {0};
    int rc,i;
    char *data = "\n\
MY_VARIABLE_BEGIN\n\
var1 \n\
var2\n\
...\n\
MY_VARIABLE_END\n\
MY_VALUES_BEGIN\n\
val1\n\
val2\n\
...\n\
MY_VALUES_END\n\
";
    char *delim = "\n";
    char *pattern = "\\s*MY_VARIABLE_BEGIN\\s*(.*?)MY_VARIABLE_END.*?MY_VALUES_BEGIN\\s*(.*?)MY_VALUES_END";
    /* need REG_EXTENDED to use () in pattern else \\(\\) */
    rc = regcomp(&myexpn, pattern, REG_EXTENDED);
    if(rc!=0)pexit("regcomp");
    rc = regexec(&myexpn, data, NUMMATCH, matches, 0);
    if(rc==REG_NOMATCH)printf("no match\n");
    else{
        for(i = 1;i<NUMMATCH;i++){ /* ignore group 0 which is whole match */
            if(matches[i].rm_so!=-1){
                char *dup = strndup(data+matches[i].rm_so, matches[i].rm_eo-matches[i].rm_so);
                printf(" match %d %d..%d \"%s\"\n",i, matches[i].rm_so, matches[i].rm_eo, dup);
                char *ptr = strtok(dup, delim);
                while(ptr){
                    printf("    token: %s\n",ptr);
                    ptr = strtok(NULL, delim);
                }
                free(dup);
            }
        }
    }
    regfree(&myexpn);
}

打印出来:

 match 1 19..34 "var1 
var2
...
"
    token: var1 
    token: var2
    token: ...
 match 2 66..80 "val1
val2
...
"
    token: val1
    token: val2
    token: ...