[英]Reading a string with spaces and special character with sscanf
对于一个项目,我试图从字符串中读取一个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 >>> ram <<<", "%d %[^\t\n] >>> %*s <<<", &age, buffer);
printf("%s is %d years old\n", buffer, age);
return 0;
}
它打印的是:我需要的“酷小子>>> ram <<<是19 岁” 。 有什么解决办法吗?
注意:有时“ cool kid”字符串也会像这样出现“ coolkid”。
您拥有了它,只是将您的丢弃物放在了错误的位置(以及轻微的大写问题):
#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
可以使用sscanf(input, "%d%*[^>]>>>%199s", &age, buffer);
。 %s
之后%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");
}
您需要查找不是>
东西,并且需要禁止在正确的位上赋值:
sscanf("19 cool kid >>> ram <<<", "%d %*[^>] >>> %199s <<<", &age, buffer);
格式中引用的长度比可用字符数少一; 换句话说,它不计算终端的空字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.