sscanf可选列

sscanf可选列,c,gcc,C,Gcc,我希望使用sscanf读取包含以下格式数据的文件,其中一个重要标准是“进一步数据”是可选的 AIDSOMEDATA进一步的数据 sscanf(currentline[i], "%[^\t] %[^\t] %11 [^\n]", aIDVar, someDataVar, furtherDatVar) == 3 有没有办法做到这一点,谢谢 您通常可以通过检查*scanf的返回值来执行此操作,以确保扫描了正确数量的参数,类似于以下完整程序: #include <stdio.h>

我希望使用sscanf读取包含以下格式数据的文件,其中一个重要标准是“进一步数据”是可选的

AIDSOMEDATA进一步的数据

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,否则失败.