Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf读取格式化输入_C_Scanf - Fatal编程技术网

使用scanf读取格式化输入

使用scanf读取格式化输入,c,scanf,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\u BEGIN、MY_values\u BEGIN分隔 问题是我不知道变量的

我想使用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\u BEGIN、MY_values\u BEGIN分隔

问题是我不知道变量的数量和它们的值。 有谁能帮我找到传递给scanf函数的正确格式,或者是否有其他解决方案

输入示例

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

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"));
}
不确定它是否有效。

用scanf做这件事很痛苦。为什么不使用C中的正则表达式呢? 这里有一个完整的工作程序来说明它是多么容易。 首先,将所有数据读入一个字符串data。我只是用一个常数。 使用regcomp编译模式,然后使用regexec将其应用于字符串。 它返回一个匹配组数组,该数组对应于.*?部分图案。 组0在本例中不感兴趣,因为它只是整个数据

对于其他两个组,您可以在匹配的开始和结束字符串中获取索引。 使用strndup复制这些。使用strtok在换行符上拆分此dup\n。 在ptr中的每个点上都有每个var和值

/* 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);
}

开始字符串和结束字符串是人工的还是真的写入了stdin?您能绝对确定每个变量都有一个值吗?您必须使用例如fgets3将每一行作为字符串读取,然后扫描字符串开头的“我的部分”,如果没有,则使用例如sscanf3解析变量,并将变量存储到数组中,必要时使用例如realloc3增加数组。这是一种非常普遍的做法;您可以对输入数据使用一些约束。请提供一个具体的例子,使用实数和变量,这样我可以为您提供一个C代码来读取。@cad 1开始和结束字符串MY_VARIABLE\u BEGIN,MY_VARIABLE\u end,MY_VALUES\u BEGIN,MY_VALUES_END实际上是用标准格式写的,它们用作分隔符。2我假设每个变量都有value@fedi是的,它们是分隔符,但它们之间有什么内容。请提供有关信息。
/* 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: ...