使用scanf一次返回一个字符串,由特定字符分隔
我试图在C中将一个字符串排序为不同的变量(当我说string时,我指的是char数组)。该字符串包含较小的“块”,由一个制表符分隔,我希望sscanf在每次调用时将下一个“块”放入字符串中 例如,如果字符串是使用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读取所有内容
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()的合理尝试,我将帮助您使其正常工作。