我正在尝试阅读以下格式编写的一行:
O.SetActive(false);
H.SetActive(false);
NewObj = Instantiate (NewObj, sphere.transform.position, Quaternion.identity) as GameObject;
单词之间有任意数量的空格。我很好奇是否有一种简单的方法可以使用像sscanf之类的东西将引号中的内部字符转换为char *变量?我保证报价,并且不会超过32个字符(包括空格)。紧跟引号后面还会有一个新行字符。
答案 0 :(得分:2)
大多数scanf()
字段描述符隐式导致跳过前导空格并期望该字段以空格终止。但是,要扫描可能包含空格的字符串,可以将%[]
字段描述符与适当的扫描集一起使用。因此,您可以按照您描述的模式扫描行序列,如下所示:通过循环调用:
char keyword[32], value[32], description[32];
scanf("%s%s%*[ \t]\"%[^\"]\"", keyword, value, description);
该格式字符串:
char
数组keyword
和value
,char
数组description
,并扫描并丢弃引号。它依赖于正确格式化的数据;除其他外,如果数据格式错误,这很容易受到缓冲区溢出的影响。您可以通过在格式字符串中指定最大字段宽度来解决这个问题。
另请注意,您应检查函数的返回值,以确保所有字段都已成功匹配。这将允许您在输入格式错误的情况下提前终止,甚至可以提供有关畸形位置的有效信息。
答案 1 :(得分:0)
您可以使用scanf ("%s%s%31[^\n]",s1,s2,s3);
示例:
#include <stdio.h>
int main()
{
char s1[32],s2[32],s3[32];
printf ("write something: ");
scanf ("%s%s%31[^\n]",s1,s2,s3);
printf ("%s %s %s",s1,s2,s3);
return 0;
}
s1
和s2
将忽略空格,但s3
将不会
答案 2 :(得分:0)
使用\"%32[^\"]\"
捕获引用的词组。使用"%n"
检测成功。
char w1[32+1];
char w2[32+1];
char w3[32+1];
int n = 0;
sscanf(buffer, "%32s%32s \"%32[^\"]\" %n", w1, w2, w3, &n);
if (n == 0) return fail; // format mis-match
if (buffer[n]) return fail; // Extra garbage detected
// else good to go.
"%32s"
跳过空格,然后阅读&amp;最多可保存32个非空白区char
。附加'\0'
。
" "
略去空格。
"\""
匹配'\"'
。
"%32[^\"]"
阅读并保存最多32个非'\"'
char
。附加'\0'
。
"%n"
保存扫描的字符数。