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

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

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

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

你是对的: sscanf确实没有“移动”,因为没有什么可以移动的。 如果你需要扫描一堆int,你可以使用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); } 

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

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

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

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

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