我有字符串(45 个字节):
String1 String2000000000001234
我需要从此字符串中获取三个变量:
char * var1="String1";
char * var2="String2";
int var3=1234;
这里有固定长度(15 个字节)的 3 部分。我需要将所有部分保存到变量中,字符串没有空格,整数没有前导零。
scanf() 可以做到这一点吗?我怎么能做到这一点?
sscanf 不可能。首先,您需要传递一个 char数组(如果您使用 _s 种类,还需要传递大小)而不仅仅是一个 char 指针(即它需要有与之关联的内存)。其次,sscanf 中的字符串以空格结尾,而在 String2 和 0000 之间没有空格。为此格式编写一个自定义解析器。
据此,您的问题应通过以下格式解决:
%*[^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 - 最后,读取数字
最简单的可能是:
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 的返回值的检查,以确保输入字符串的格式正确。