我有一个包含整数的字符串,我正在尝试将所有内容放入另一个数组中。当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,它只停留在第一个位置。
知道什么是错的吗?感谢。
答案 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类型)的最大值的整数,请使用strtol
或strtoll
。请注意,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