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

时间:2015-08-26 02:45:37

标签: c scanf

对于一个项目,我试图从字符串中读取一个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;也是这样。

3 个答案:

答案 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之后的任何内容与扫描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");
}

答案 2 :(得分:1)

您需要查找不是>的内容,并且需要在正确的位上禁止分配:

sscanf("19 cool kid >>> ram <<<", "%d %*[^>] >>> %199s <<<", &age, buffer);

格式中引用的长度比可用字符数少一个;换句话说,它不计算终端空字节。