如何用sscanf_s()解析字符串?

时间:2012-09-24 16:44:30

标签: c++ scanf

我有字符串(45个字节):

        String1        String2000000000001234

我需要从这个字符串中获取三个变量:

char * var1="String1";
char * var2="String2";
int var3=1234;

这里有3个固定长度的部分(15个字节)。我需要将所有部分保存到变量中,而不使用字符串空格,并且不对整数赋予零。

scanf()有可能吗?我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

sscanf不可能。首先,你需要传递一个char 数组(如果你使用_s变种那么大小),而不仅仅是一个char指针(即它需要有与之关联的内存)。其次,sscanf中的字符串以空格终止,而String2和0000之间没有字符串。为此格式编写自定义解析器。

答案 1 :(得分:3)

根据this,您的问题应通过以下格式解决:

%*[^a-zA-Z]%s%*[^a-zA-Z]%[^0]s%*[^1-9]%d

说明

%* [^ a-zA-Z] - 跳过(不存储)直到按字母顺序排列,即跳过前导空格

%s - 读取第一个字符串直到空格

%* [^ a-zA-Z] - 跳过尾随空格直到下一个字符串

%[^ 0] s - 读取字符串util zeros

%* [^ 1-9] -skip直到非零数字

%d - 最后,读取数字

答案 2 :(得分:0)

最简单的可能是:

char var1_buffer[31] = "", var2_buffer[31] = "";
sscanf(string+30, "%d", &var3);
string[30] = '\0';
sscanf(string, "%s%s", var1_buffer, var2_buffer);
var1 = strdup(var1_buffer);
var2 = strdup(var2_buffer);

需要能够写入输入字符串。如果那是不可能的,你可以用第3行和第4行替换:

int p1 = 0;
sscanf(string, "%30s %n%30s", var1_buffer, &p1, var2_buffer);
if (p1 > 30)
    p1 = 30;
var2_buffer[30-p1] = '\0';

在任何一种情况下,您都应该添加对sscanf返回值的检查,以确保输入字符串格式正确。