sscanf不';不移动,每次扫描相同的整数

sscanf不';不移动,每次扫描相同的整数,c,string,input,scanf,C,String,Input,Scanf,我有一个包含整数的字符串,我正在尝试将所有整数放入另一个数组中。当sscanf未能找到int时,我希望循环停止。因此,我做了以下工作: int i; int getout = 0; for (i = 0; i < bsize && !getout; i++) { if (!sscanf(startbuffer, "%d", &startarray[i])) { getout = 1; } } //startbuffer is a st

我有一个包含整数的字符串,我正在尝试将所有整数放入另一个数组中。当
sscanf
未能找到
int
时,我希望循环停止。因此,我做了以下工作:

int i;
int getout = 0;
for (i = 0; i < bsize && !getout; i++) {
    if (!sscanf(startbuffer, "%d", &startarray[i])) {
        getout = 1;
    }
}
//startbuffer is a string, startarray is an int array.
inti;
int getout=0;
对于(i=0;i
这导致
startarray
的所有元素成为
startbuffer
中的第一个字符。
sscanf
工作正常,但它不会移动到下一个int,而是停留在第一个位置


知道怎么了吗?谢谢。

这是sscanf的正确行为。sscanf在一个
常量char*
上运行,而不是来自文件的输入流,因此它不会存储关于它所使用的内容的任何信息

对于解决方案,您可以在格式字符串中使用
%n
,以获取到目前为止它已使用的字符数(这在C89标准中定义)

e、 g.
sscanf(“这是一个字符串,“%10s%10s%n”、tok1、tok2和numChar)
numChar
将包含到目前为止使用的字符数。您可以将其用作偏移量以继续扫描字符串


如果字符串仅包含不超过long-type(或long-long-type)最大值的整数,请使用
strtol
strtoll
。请注意,
long
类型可以是32位或64位,具体取决于系统。

您是正确的:
sscanf
确实不会“移动”,因为没有任何东西可以移动。如果需要扫描一组整数,可以使用strtol
——它告诉您它读取了多少,这样您就可以在下一次迭代中将下一个指针返回到函数

char str[] = "10 21 32 43 54";
char *p = str;
int i;
for (i = 0 ; i != 5 ; i++) {
    int n = strtol(p, &p, 10);
    printf("%d\n", n);
}

将字符串转换为流,然后可以使用fscanf获取整数。 试试这个。

每次调用
sscanf
时都会传递相同的字符串指针。如果它要“移动”输入,那么每次都必须移动字符串的所有字节,这对于长字符串来说会很慢。此外,它将移动未扫描的字节

相反,您需要通过查询消耗的字节数和读取的值数来自己实现这一点。使用这些信息自己调整指针

int nums_now, bytes_now;
int bytes_consumed = 0, nums_read = 0;

while ( ( nums_now = 
        sscanf( string + bytes_consumed, "%d%n", arr + nums_read, & bytes_now )
        ) > 0 ) {
    bytes_consumed += bytes_now;
    nums_read += nums_now;
}

有趣的是,这被添加到POSIX-2008中:漂亮!移植到embedded时非常有用。当
bytes\u consumered==strlen(string)
(在最后一次调用中,它应该会打破循环)时,我现在为
nums\u
获取假值。这也是意料之中的吗?@mangledorf根据“如果输入在第一次转换(如果有的话)完成之前结束,并且没有发生匹配失败,则应返回EOF。”这听起来像零基本上被重新映射为负一。啊哈!所以num_rows是一个有符号整数是非常重要的。这相当微妙。可能是重复的