用sscanf读取带空格的字符串

SDL*_*mes 37 c string scanf

对于一个项目,我正在尝试从字符串中读取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)

  • @RyanS:不,不是我,这是字符串和数字之间的自然不和谐使你感到悲伤.他们不一样.有时候我也很难过,但不知怎的,我学会了应对.为什么哦为什么,残酷的世界?!!! (3认同)

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)

  • 好吧,这对我的堂兄来说不起作用,他的名字是"George Fortescue Aloicious Broomhilda Doreen Beelzebub ...... Johanssen MacGregor":-) (11认同)
  • 确实 - 你的堂兄应该向OP抱怨只分配200字节的缓冲区;) (5认同)

pax*_*blo 8

如果要扫描到字符串的末尾(如果存在则删除换行符),只需使用:

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).

  • 那么在这里,你的堂兄会导致崩溃,而不是遭受他的名字被截断的侮辱?而且,我的堂兄,更加可疑的名字(他的第二个名字的第三个字符是换行符)是不开心的. (4认同)