对于一个项目,我正在尝试从字符串中读取int和字符串.唯一的问题是sscanf在看到空格时似乎打破了读取%s.反正有没有解决这个限制?这是我正在尝试做的一个例子:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char** argv) {
int age;
char* buffer;
buffer = malloc(200 * sizeof(char));
sscanf("19 cool kid", "%d %s", &age, buffer);
printf("%s is %d years old\n", buffer, age);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的印刷品是:"酷是19岁",我需要"酷孩子19岁".有谁知道如何解决这一问题?
Bru*_*oLM 42
以下行将开始读取一个数字(%d),后跟与制表符或换行符(%[^\t\n])不同的内容.
sscanf("19 cool kid", "%d %[^\t\n]", &age, buffer);
Run Code Online (Sandbox Code Playgroud)
caf*_*caf 12
您需要%c转换说明符,它只读取一系列字符而无需对空格进行特殊处理.
请注意,您需要先用零填充缓冲区,因为说明%c符不会写入nul-terminator.您还需要指定要读取的字符数(否则默认为1):
memset(buffer, 0, 200);
sscanf("19 cool kid", "%d %199c", &age, buffer);
Run Code Online (Sandbox Code Playgroud)
如果要扫描到字符串的末尾(如果存在则删除换行符),只需使用:
char *x = "19 cool kid";
sscanf (x, "%d %[^\n]", &age, buffer);
Run Code Online (Sandbox Code Playgroud)
那是因为%s只匹配非空白字符,并且会在它找到的第一个空格上停止.该%[^\n]格式说明会的每一个字符,这不是(因为匹配^中给出的选择)(这是一个换行符).换句话说,它将匹配任何其他角色.
请记住,您应该在缓冲区中分配足够的空间来获取字符串,因为您无法确定将读取多少内容(scanf/fscanf除非您使用特定的字段宽度,否则这是一个远离的好理由).
你可以这样做:
char *x = "19 cool kid";
char *buffer = malloc (strlen (x) + 1);
sscanf (x, "%d %[^\n]", &age, buffer);
Run Code Online (Sandbox Code Playgroud)
(你不需要,* sizeof(char)因为根据定义,它总是 1).