从 sscanf 在 C 中获取带空格的 char*

Getting a char* with spaces in C from sscanf

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

someword:    .asciiz     "want this as a char*"

单词之间有任意数量的白色 space。我很好奇是否有一种简单的方法可以使用类似 sscanf 的方法将引号中的内部字符放入 char* 变量中?我保证引号和 where 不会超过 32 个字符(包括 spaces)。引号后还会有一个换行符。

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

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

该格式字符串:

  • 将两个以空格分隔的字符串扫描到 char 数组 keywordvalue,
  • 扫描但不分配一个或多个空白字符后跟引号,
  • 将下一个引号之前的所有内容扫描到 char 数组 description 中,然后扫描并丢弃一个引号。

它依赖于正确格式化的数据;除其他事项外,如果数据格式不正确,这很容易受到缓冲区溢出的影响。您可以通过在格式字符串中指定最大字段宽度来解决这个问题。

另请注意,您应该检查函数的 return 值以确保所有字段都已成功匹配。这将使您能够在输入格式错误的情况下提前终止,甚至可以提供有关格式错误位置的有效信息。

您可以使用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 不会

使用\"%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" 跳过白色-space,然后读取并保存最多 32 个非白色-space char。追加 '[=15=]'.
" "跳过白色space.
"\"" 匹配一个 '\"'.
"%32[^\"]"读取并保存最多32个非'\"'char。追加 '[=15=]'.
"%n" 保存扫描的字符数。