3

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

        String1        String2000000000001234

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

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

这里有固定长度(15 个字节)的 3 部分。我需要将所有部分保存到变量中,字符串没有空格,整数没有前导零。

scanf() 可以做到这一点吗?我怎么能做到这一点?

4

3 回答 3

4

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

于 2012-09-24T16:54:06.080 回答
3

据此您的问题应通过以下格式解决:

%*[^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] - 跳到非零数字

%d - 最后,读取数字

于 2012-09-24T17:19:18.667 回答
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 的返回值的检查,以确保输入字符串的格式正确。

于 2012-09-24T17:17:30.650 回答