使用scanf读取格式化输入
我想使用scanf从stdin读取一些变量及其值。输入格式如下:使用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分隔 问题是我不知道变量的
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: ...