繁体   English   中英

使用sscanf读取带空格的字符串和特殊字符

[英]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内容与扫描agebuffer无关。 不检查所有扫描内容是否会导致故障。

建议检查整个行是否按预期进行了解析。 简单的解决方案是在末尾使用" %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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM