我希望使用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
答案 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: ...