sscanf可选列
我希望使用sscanf读取包含以下格式数据的文件,其中一个重要标准是“进一步数据”是可选的 AIDSOMEDATA进一步的数据sscanf可选列,c,gcc,C,Gcc,我希望使用sscanf读取包含以下格式数据的文件,其中一个重要标准是“进一步数据”是可选的 AIDSOMEDATA进一步的数据 sscanf(currentline[i], "%[^\t] %[^\t] %11 [^\n]", aIDVar, someDataVar, furtherDatVar) == 3 有没有办法做到这一点,谢谢 您通常可以通过检查*scanf的返回值来执行此操作,以确保扫描了正确数量的参数,类似于以下完整程序: #include <stdio.h>
sscanf(currentline[i], "%[^\t] %[^\t] %11 [^\n]", aIDVar, someDataVar, furtherDatVar) == 3
有没有办法做到这一点,谢谢 您通常可以通过检查
*scanf
的返回值来执行此操作,以确保扫描了正确数量的参数,类似于以下完整程序:
#include <stdio.h>
static void testFn (char *str) {
int var1, var2, var3;
if (sscanf(str, "%d %d %d", &var1, &var2, &var3) != 3) {
var3 = 42;
if (sscanf(str, "%d %d", &var1, &var2) != 2) {
var1 = var2 = var3 = -1;
}
}
printf ("[%-10s] -> %3d %3d %3d\n", str, var1, var2, var3);
}
int main (void) {
testFn ("");
testFn ("1");
testFn ("1 2");
testFn ("1 2 3");
testFn ("1 2 3 4");
return 0;
}
您需要根据您的特定数据进行调整,但这是基本理论。首先尝试较大的数量,如果这不好,尝试使用较低的默认数量
增编: 正如ugoren在评论中指出的那样,
*scanf
在这种情况下不需要重复。事实上,这对于像fscanf
这样的东西来说是有问题的,因为文件指针在第一次尝试后会移动
因为指令是按顺序处理的,所以您可以只存储返回值并重用它-在第三个%d
上出现故障之前,前两个指令应该已经执行(存储到var1
和var2
)。testFn
函数可以重写为:
static void testFn (char *str) {
int quant, var1, var2, var3;
if ((quant = sscanf(str, "%d %d %d", &var1, &var2, &var3)) != 3)
if (quant == 2)
var3 = 42;
else
var1 = var2 = var3 = -1;
printf ("[%-10s] -> %3d %3d %3d\n", str, var1, var2, var3);
}
通常,您可以通过检查
*scanf
的返回值来执行此操作,以确保扫描的参数数量正确,类似于以下完整程序:
#include <stdio.h>
static void testFn (char *str) {
int var1, var2, var3;
if (sscanf(str, "%d %d %d", &var1, &var2, &var3) != 3) {
var3 = 42;
if (sscanf(str, "%d %d", &var1, &var2) != 2) {
var1 = var2 = var3 = -1;
}
}
printf ("[%-10s] -> %3d %3d %3d\n", str, var1, var2, var3);
}
int main (void) {
testFn ("");
testFn ("1");
testFn ("1 2");
testFn ("1 2 3");
testFn ("1 2 3 4");
return 0;
}
您需要根据您的特定数据进行调整,但这是基本理论。首先尝试较大的数量,如果这不好,尝试使用较低的默认数量
增编: 正如ugoren在评论中指出的那样,
*scanf
在这种情况下不需要重复。事实上,这对于像fscanf
这样的东西来说是有问题的,因为文件指针在第一次尝试后会移动
因为指令是按顺序处理的,所以您可以只存储返回值并重用它-在第三个%d
上出现故障之前,前两个指令应该已经执行(存储到var1
和var2
)。testFn
函数可以重写为:
static void testFn (char *str) {
int quant, var1, var2, var3;
if ((quant = sscanf(str, "%d %d %d", &var1, &var2, &var3)) != 3)
if (quant == 2)
var3 = 42;
else
var1 = var2 = var3 = -1;
printf ("[%-10s] -> %3d %3d %3d\n", str, var1, var2, var3);
}
除了绝对微不足道的输入,
fgets
通常是比scanf
更好的工具。不难做到:
void input(char *str){
int x, vars[3];
char *sp;
for(x=0,sp=strtok(str, " \t");x<3&&sp; x++,sp=strtok(NULL, " \t")){
vars[x] = atoi(sp);
}
if(x<3) //didn't read enough
//..deal with it
if(sp) //your optional field is present
//deal with that.
}
void输入(char*str){
int x,vars[3];
char*sp;
对于(x=0,sp=strtok(str,“\t”);x而言,除了绝对微不足道的输入之外,fgets
通常是比scanf
更好的工具。不难做到:
void input(char *str){
int x, vars[3];
char *sp;
for(x=0,sp=strtok(str, " \t");x<3&&sp; x++,sp=strtok(NULL, " \t")){
vars[x] = atoi(sp);
}
if(x<3) //didn't read enough
//..deal with it
if(sp) //your optional field is present
//deal with that.
}
void输入(char*str){
int x,vars[3];
char*sp;
对于(x=0,sp=strtok(str,“\t”);xIs第二个sscanf
需要吗?你不能简单地sscanf
一次,如果你有3个就可以了,如果你有2个就应该设置var3,否则失败。第二个sscanf
需要吗?你不能简单地sscanf
一次,如果你有3个就可以了,如果你有2个就应该设置var3,否则失败.