从 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
数组 keyword
和 value
,
- 扫描但不分配一个或多个空白字符后跟引号,
- 将下一个引号之前的所有内容扫描到
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;
}
s1
和 s2
将忽略空格,但 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"
保存扫描的字符数。
我正在尝试读取以以下格式编写的一行:
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
数组keyword
和value
, - 扫描但不分配一个或多个空白字符后跟引号,
- 将下一个引号之前的所有内容扫描到
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;
}
s1
和 s2
将忽略空格,但 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"
保存扫描的字符数。