对于一个项目,我试图从字符串中读取一个int和一个字符串。这里唯一的问题是sscanf在看到空格和一些特殊字符时似乎打破了读%s
。我想只打印出特殊字符内的String。反正有没有解决这个限制?以下是我尝试做的一个例子:
类似于this link,几乎没有变化
#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 >>> ram <<<", "%d %[^\t\n] >>> %*s <<<", &age, buffer);
printf("%s is %d years old\n", buffer, age);
return 0;
}
它打印的内容是:&#34;酷孩子&gt;&gt;&gt; ram&lt;&lt;&lt;是19岁&#34; 我需要&#34; ram是19岁&#34; 。有什么工作吗?
注意:一段时间&#34;酷孩子&#34;字符串来&#34; coolkid&#34;也是这样。
答案 0 :(得分:2)
你有它,你刚丢弃了错误的地方(以及轻微的大写问题):
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int age;
char* buffer;
if (!(buffer = malloc(200 * sizeof *buffer))) {
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
sscanf("19 cool kid >>> ram <<<", "%d %*[^>] >>> %s <<<", &age, buffer);
printf("%s is %d years old\n", buffer, age);
free (buffer);
return 0;
}
<强>输出强>
$ ./bin/sscanf_strange
ram is 19 years old
答案 1 :(得分:2)
可以使用sscanf(input, "%d%*[^>]>>>%199s", &age, buffer);
。 %s
之后的任何内容与扫描age
和buffer
无关。不检查所有扫描是否都会导致问题。
建议检查整行是否按预期解析。简单的解决方案是在最后使用" %n"
。如果扫描到达那么远,这可以节省char
扫描的数量。
const char *input = "19 cool kid >>> ram <<<";
int n = 0;
sscanf(input, "%d%[^>]>>>%*199s <<< %n", &age, buffer, &n);
if (n == 0 || input[n]) {
puts("Bad Input");
}
答案 2 :(得分:1)
您需要查找不是>
的内容,并且需要在正确的位上禁止分配:
sscanf("19 cool kid >>> ram <<<", "%d %*[^>] >>> %199s <<<", &age, buffer);
格式中引用的长度比可用字符数少一个;换句话说,它不计算终端空字节。