5

我做了一些研究以寻找sscanf()源代码。但我找不到我的问题的答案。

当我们这样使用时sscanf()

char str[50] = "5,10,15";
int x;
sscanf(str,"%d,%s",&x,str);

sscanf() 是否支持“递归”缓冲区str

4

4 回答 4

3

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

这只是一个反例,表明这是一个坏主意并且行不通。所以你可以说这会在某个时候调用未定义的行为或导致其他问题。

于 2012-11-27T10:52:18.573 回答
3

它不会脱离自修改缓冲区。但是要使其(尾)递归,您必须阅读到字符串的末尾。
代码片段:

char str[]="5,10,15";
int a[10]={0},x = 0; 
while (sscanf(str,"%d,%s",a+ x++,str)>1);

读取所有整数。

由于这不是真正的递归并且要读取的字符串不会覆盖字符串中的 asciiz,我相信这在含义上是“安全的”:只在家里尝试一下。

于 2012-11-27T10:44:42.947 回答
1

一般来说,我会建议不要这样做。如果它一旦起作用并不意味着它在所有极端情况下都会起作用。确实,您必须检查您正在使用的实现的来源。如果您希望它是可移植的,请立即忘记它,除非您在 libc 规范中看到它是一种有保证的行为。用于strchr()查找下一个分隔符并更新字符串指针以指向下一个字符。

于 2012-11-27T10:51:57.233 回答
0

的使用strtok()解决了我遇到的几乎相同的问题,即递归地使用将 a (由空格分隔的双精度列表,例如)sscanf()的内容提取到双精度数组(例如,...)中。char*"1.00 2.01 ..."array[1]=1.00array[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()

于 2015-07-03T22:56:00.193 回答