我有一个具有整数字符串,我试图让所有的整数到另一个阵列。 当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它只是停留在第一位置。
任何想法有什么不对? 谢谢。
每次调用时相同的字符串指针传递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
确实不“动”,因为没有移动。 如果您需要扫描一堆整数的,你可以用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类型)的最大值整数,使用strtol
或strtoll
。 要注意的是long
的类型可以是32位或64位,这取决于系统。
将字符串到流,那么你可以使用的fscanf得到整数。 试试这个。 http://www.gnu.org/software/libc/manual/html_node/String-Streams.html