14

我有一个包含整数的字符串,我正在尝试将所有整数放入另一个数组中。当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成为 中的第一个字符startbuffersscanf工作正常,但它不会移动到下一个 int 它只是停留在第一个位置。

知道有什么问题吗?谢谢。

4

4 回答 4

16

每次调用时都会传递相同的字符串指针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;
}
于 2012-05-31T03:23:10.573 回答
5

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

于 2012-05-31T03:20:45.123 回答
4

这是 sscanf 的正确行为。sscanf 对 a 进行操作const char*,而不是来自文件的输入流,因此它不会存储任何有关它所使用内容的信息。

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

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

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

于 2012-05-31T03:13:55.863 回答
4

你是对的:sscanf确实没有“移动”,因为没有什么可以移动。如果你需要扫描一堆整数,你可以使用strtol- 它告诉你它读了多少,所以你可以在下一次迭代中将 next 指针反馈给函数。

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);
}
于 2012-05-31T03:13:57.693 回答