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

时间:2012-05-31 03:08:09

标签: 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 string, startarray is an int array.

这会导致startarray的所有元素成为startbuffer中的第一个字符。 sscanf工作正常,但它不会移动到下一个int,它只停留在第一个位置。

知道什么是错的吗?感谢。

4 个答案:

答案 0 :(得分:15)

每次调用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;
}

答案 1 :(得分:4)

这是sscanf的正确行为。 sscanf在const char*上运行,而不是来自文件的输入流,因此它不会存储有关它消耗的信息。

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

e.g。 sscanf("This is a string", "%10s%10s%n", tok1, tok2, &numChar); numChar将包含到目前为止消耗的字符数。您可以将其用作偏移量以继续扫描字符串。

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

答案 2 :(得分:4)

你是对的: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);
}

答案 3 :(得分:3)

将字符串转换为流,然后您可以使用fscanf来获取整数。 试试这个。 http://www.gnu.org/software/libc/manual/html_node/String-Streams.html