Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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,我试图在C中将一个字符串排序为不同的变量(当我说string时,我指的是char数组)。该字符串包含较小的“块”,由一个制表符分隔,我希望sscanf在每次调用时将下一个“块”放入字符串中 例如,如果字符串是00:00:00:00 12345 abcd,我希望第一个sscanf调用将00:00:00放入字符串,下一个sscanf调用将12345放入字符串,以此类推 我不明白为什么我的代码不起作用。我有sscanf(s,“%[^\t]%*c”,buf),它(我认为)应该告诉sscanf读取所有内容

我试图在C中将一个字符串排序为不同的变量(当我说string时,我指的是char数组)。该字符串包含较小的“块”,由一个制表符分隔,我希望sscanf在每次调用时将下一个“块”放入字符串中

例如,如果字符串是
00:00:00:00 12345 abcd
,我希望第一个sscanf调用将
00:00:00
放入字符串,下一个sscanf调用将
12345
放入字符串,以此类推

我不明白为什么我的代码不起作用。我有
sscanf(s,“%[^\t]%*c”,buf)
,它(我认为)应该告诉sscanf读取所有内容直到一个制表符,然后
%*c
告诉它读取但放弃制表符(以便下次调用sscanf时,没有前导制表符)。字符串中分隔块的制表符不得超过1个

我确信有一种比使用sscanf更好的方法,如果有人告诉我,那就太好了,但我也想弄清楚这一点,因为它看起来非常简单,我不知道为什么不起作用。感谢您的帮助

查看一个更简单的拆分方法

还请注意,您的sscanf调用不会修改字符串,只需从中提取(即,在第二次调用时,您不能在不首先修改它的情况下将
s
传递回该字符串。)要使用sscanf执行此操作,类似这样的操作即可:

while (/* do your own check on str here*/)
{    
    // Scan the next part
    sscanf(str, "%[^\t]%s", firstBit, remain);

    // Copy it back and do it again
    strcpy(str, remain); // Being careful here not to sscanf into the source string!!
}
查看一个更简单的拆分方法

还请注意,您的sscanf调用不会修改字符串,只需从中提取(即,在第二次调用时,您不能在不首先修改它的情况下将
s
传递回该字符串。)要使用sscanf执行此操作,类似这样的操作即可:

while (/* do your own check on str here*/)
{    
    // Scan the next part
    sscanf(str, "%[^\t]%s", firstBit, remain);

    // Copy it back and do it again
    strcpy(str, remain); // Being careful here not to sscanf into the source string!!
}
示例代码:

#include <stdio.h>

int main(){
    char s[] = "00:00:00:00\t12345\tabcd";
    char buf[32];
    int pos = 0, read_len;

    //%n : reading character count into read_len address
    //pos : next read position
    while(1==sscanf(s + pos, "%[^\t]%n%*c", buf, &read_len)){
        printf("%s\n", buf);
        pos += read_len + 1;
        if(s[pos] == '\0') break;
    }
    return 0;
}
#包括
int main(){
字符s[]=“00:00:00\t12345\tabcd”;
char-buf[32];
int pos=0,读取长度;
//%n:正在将字符计数读入读取长度地址
//位置:下一个读取位置
而(1==sscanf(s+pos,“%[^\t]%n%*c”,buf和read_len)){
printf(“%s\n”,buf);
位置+=读取长度+1;
如果(s[pos]='\0')中断;
}
返回0;
}
示例代码:

#include <stdio.h>

int main(){
    char s[] = "00:00:00:00\t12345\tabcd";
    char buf[32];
    int pos = 0, read_len;

    //%n : reading character count into read_len address
    //pos : next read position
    while(1==sscanf(s + pos, "%[^\t]%n%*c", buf, &read_len)){
        printf("%s\n", buf);
        pos += read_len + 1;
        if(s[pos] == '\0') break;
    }
    return 0;
}
#包括
int main(){
字符s[]=“00:00:00\t12345\tabcd”;
char-buf[32];
int pos=0,读取长度;
//%n:正在将字符计数读入读取长度地址
//位置:下一个读取位置
而(1==sscanf(s+pos,“%[^\t]%n%*c”,buf和read_len)){
printf(“%s\n”,buf);
位置+=读取长度+1;
如果(s[pos]='\0')中断;
}
返回0;
}

谢谢。。我知道它不会修改它,我只是认为%*c会在tab字符之后启动下一个sscanf调用否,它不会影响下一个调用-如果是scanf,它可能会这样做…因为您正在使用用户输入,但每次的字符串都是一样的。谢谢。。我知道它不会修改它,我只是认为%*c会在tab字符之后启动下一次sscanf调用否,它不会影响下一次调用-如果是scanf,它可能会这样做…因为您正在使用用户输入,但每次都有相同的字符串。
scanf()
是邪恶的,不要使用它,将其用于标记化是一个特别糟糕的主意
strchr()
strstrstr()
strtok\r()
都是更好的选择。scanf()没有任何问题。请提供一个代码示例,说明使用scanf()的合理尝试,我将帮助您使其正常工作。
scanf()
是邪恶的,不要使用它,将其用于标记化是一个特别糟糕的主意
strchr()
strstrstr()
strtok\r()
都是更好的选择。scanf()没有任何问题。请提供一个代码示例,说明使用scanf()的合理尝试,我将帮助您使其正常工作。