我做了一些研究以寻找sscanf()
源代码。但我找不到我的问题的答案。
当我们这样使用时sscanf()
:
char str[50] = "5,10,15";
int x;
sscanf(str,"%d,%s",&x,str);
sscanf() 是否支持“递归”缓冲区str
?
scanf 系列函数读取格式说明符并逐一进行转换。在您的示例代码中:
char str[50] = "5,10,15";
int x;
sscanf(str,"%d,%s",&x,str);
它可能会起作用,因为它首先读取一个整数和另一个 c 字符串。这里没有问题,因为原始str
值被新值覆盖。
但请考虑以下几点:
char str[50] = "5 10 15";
int x;
sscanf(str,"%s %d",str, &x);
它首先5
从原始值读取并覆盖str
,随后的格式说明符%d
将没有任何可读取的内容,因为由于先前读取的 nul 终止已经到达str
末尾。str
%s
这只是一个反例,表明这是一个坏主意并且行不通。所以你可以说这会在某个时候调用未定义的行为或导致其他问题。
它不会脱离自修改缓冲区。但是要使其(尾)递归,您必须阅读到字符串的末尾。
代码片段:
char str[]="5,10,15";
int a[10]={0},x = 0;
while (sscanf(str,"%d,%s",a+ x++,str)>1);
读取所有整数。
由于这不是真正的递归并且要读取的字符串不会覆盖字符串中的 asciiz,我相信这在含义上是“安全的”:只在家里尝试一下。
一般来说,我会建议不要这样做。如果它一旦起作用并不意味着它在所有极端情况下都会起作用。确实,您必须检查您正在使用的实现的来源。如果您希望它是可移植的,请立即忘记它,除非您在 libc 规范中看到它是一种有保证的行为。用于strchr()
查找下一个分隔符并更新字符串指针以指向下一个字符。
的使用strtok()
解决了我遇到的几乎相同的问题,即递归地使用将 a (由空格分隔的双精度列表,例如)sscanf()
的内容提取到双精度数组(例如,...)中。char*
"1.00 2.01 ..."
array[1]=1.00
array[2]=2.01
如果我相信我理解您的问题,以下内容可能会有所帮助:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char str[]= "5,10,15";
char* token;
int x[3];
token = strtok(str, ",");
for(int i=0; i<3; i++){
sscanf(token, "%d", &x[i]);
token = strtok(NULL, ",");
}
for(int i=0; i<3; i++) printf("%d\n", x[i]);
return 0;
}
在运行时,它会产生:
5
10
15
有关. _ _strtok()