用sscanf读空格string
对于一个项目,我试图从string中读取一个int和一个string。 唯一的问题是,当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; }
它打印的是“酷十九岁”,我需要“酷十九岁”。 有谁知道如何解决这个问题?
以下行将开始读取一个数字( %d
),然后是与制表符或换行符( %[^\t\n]
)不同的任何内容。
sscanf("19 cool kid", "%d %[^\t\n]", &age, buffer);
您需要%c
转换说明符,它只读取一个字符序列,而不用特殊处理空格。
请注意,您需要先用零填充缓冲区,因为%c
说明符不会写入一个空终止符。 您还需要指定要读取的字符数(否则默认仅为1):
memset(buffer, 0, 200); sscanf("19 cool kid", "%d %199c", &age, buffer);
如果你想扫描到string的末尾(如果有的话去掉换行符),只需使用:
char *x = "19 cool kid"; sscanf (x, "%d %[^\n]", &age, buffer);
这是因为%s
只匹配非空白字符,并停留在find的第一个空白字符处。 %[^\n]
格式说明符将匹配给定select(这是一个换行符)中不是(因为^
)的每个字符。 换句话说,它将匹配任何其他字符。
请记住,你应该已经在你的缓冲区中分配足够的空间来接收string,因为你不能确定将读取多less(除非你使用特定的字段宽度,否则离开scanf/fscanf
是一个很好的理由)。
你可以这样做:
char *x = "19 cool kid"; char *buffer = malloc (strlen (x) + 1); sscanf (x, "%d %[^\n]", &age, buffer);
(你不需要* sizeof(char)
因为定义总是 1)。
既然你想要input的尾部string,你可以使用%n
(到目前为止消耗的字符数)来得到尾部string开始的位置。 这样可以避免内存复制和缓冲区大小问题,但是如果您需要复制,则可能需要明确地执行这些操作。
const char *input = "19 cool kid"; int age; int nameStart = 0; sscanf(input, "%d %n", &age, &nameStart); printf("%s is %d years old\n", input + nameStart, age);
输出:
cool kid is 19 years old
我想这是你想要的,它确实是你指定的。
#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 cool %s", &age, buffer); printf("cool %s is %d years old\n", buffer, age); return 0; }
格式期望:首先一个数字(把它放在where&age指向的地方),然后是空格(零个或多个),然后是文字string“cool”,然后再空白(零或多),然后最后一个string(和把它放在任何缓冲点)。 您忘记了格式string中的“酷”部分,因此格式只是假定您想要分配给缓冲区的string。 但是你不想分配这个string,只能跳过它。
或者,您也可以使用格式化string,如“%d%s%s”,但是您必须为其指定另一个缓冲区(使用不同的名称),并将其打印为:“%s%s是%d年老\ n”。