从sscanf获取带有C空格的char *

时间:2015-04-27 20:07:18

标签: c char scanf

我正在尝试阅读以下格式编写的一行:

O.SetActive(false);
 H.SetActive(false);
NewObj = Instantiate (NewObj, sphere.transform.position, Quaternion.identity) as GameObject;

单词之间有任意数量的空格。我很好奇是否有一种简单的方法可以使用像sscanf之类的东西将引号中的内部字符转换为char *变量?我保证报价,并且不会超过32个字符(包括空格)。紧跟引号后面还会有一个新行字符。

3 个答案:

答案 0 :(得分:2)

大多数scanf()字段描述符隐式导致跳过前导空格并期望该字段以空格终止。但是,要扫描可能包含空格的字符串,可以将%[]字段描述符与适当的扫描集一起使用。因此,您可以按照您描述的模式扫描行序列,如下所示:通过循环调用:

char keyword[32], value[32], description[32];
scanf("%s%s%*[ \t]\"%[^\"]\"", keyword, value, description);

该格式字符串:

  • 将两个以空格分隔的字符串扫描到char数组keywordvalue
  • 扫描但不指定一个或多个空格字符后跟引号
  • 扫描所有内容,但不包括下一个引号到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;
}

s1s2将忽略空格,但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"保存扫描的字符数。