gpt4 book ai didi

c - 正确使用 sscanf

转载 作者:行者123 更新时间:2023-12-03 18:08:11 28 4
gpt4 key购买 nike

我应该得到一个可以是以下任何格式的输入行:

  • 单词 1 和单词 2 之间必须有空格。
  • 单词 2 和单词 3 之间必须有逗号。
  • 单词 2 和单词 3 之间不一定要有空格,但可以有任意数量的空格。

  • 如何分离 1、2 和 3 个单词的大小写并将数据放入正确的变量中?
    word1
    word1 word2
    word1 word2 , word3
    word1 word2,word3

    我想过这样的事情:
    sscanf("string", "%s %s,%s", word1, word2, word3);

    但它似乎不起作用。

    我使用严格的 C89。

    最佳答案

    int n = sscanf("string", "%s %[^, ]%*[, ]%s", word1, word2, word3);
    n中的返回值告诉您成功完成了多少作业。 %[^, ]是一个否定的字符类匹配,它找到一个不包含逗号或空格的单词(如果你愿意,可以添加制表符)。 %*[, ]是查找逗号或空格但禁止分配的匹配项。

    我不确定我会在实践中使用它,但它应该可以工作。然而,它未经测试。

    也许更严格的规范是:
    int n = sscanf("string", "%s %[^, ]%*[,]%s", word1, word2, word3);

    不同之处在于非分配字符类只接受逗号。 sscanf()word2 之后的任何空格(或 EOS,字符串结尾)处停止, 并在分配给 word3 之前跳过空格.以前的版本允许在第二个和第三个单词之间使用空格代替逗号,但问题并没有严格允许。

    pmg在评论中建议,分配转换规范应该被赋予一个长度以防止缓冲区溢出。请注意,长度不包括空终止符,因此格式字符串中的值必须比以字节为单位的数组大小小 1。另请注意,虽然 printf()允许您使用 * 动态指定尺寸, sscanf()等人使用 *抑制赋值。这意味着您必须专门为手头的任务创建字符串:
    char word1[20], word2[32], word3[64];
    int n = sscanf("string", "%19s %31[^, ]%*[,]%63s", word1, word2, word3);

    (Kernighan 和 Pike 建议在他们的(优秀)书籍 'The Practice of Programming' 或亚马逊 The Practice of Programming 1999 中动态格式化格式字符串。)

    Just found a problem: given "word1 word2 ,word3", it doesn't read word3. Is there a cure?



    是的,有一种治疗方法,而且实际上也很微不足道。在格式字符串中的非分配、逗号匹配转换规范之前添加一个空格。因此:
    #include <stdio.h>

    static void tester(const char *data)
    {
    char word1[20], word2[32], word3[64];
    int n = sscanf(data, "%19s %31[^, ] %*[,]%63s", word1, word2, word3);
    printf("Test data: <<%s>>\n", data);
    printf("n = %d; w1 = <<%s>>, w2 = <<%s>>, w3 = <<%s>>\n", n, word1, word2, word3);
    }

    int main(void)
    {
    const char *data[] =
    {
    "word1 word2 , word3",
    "word1 word2 ,word3",
    "word1 word2, word3",
    "word1 word2,word3",
    "word1 word2 , word3",
    };
    enum { DATA_SIZE = sizeof(data)/sizeof(data[0]) };
    size_t i;
    for (i = 0; i < DATA_SIZE; i++)
    tester(data[i]);
    return(0);
    }

    示例输出:
    Test data: <<word1 word2 , word3>>
    n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
    Test data: <<word1 word2 ,word3>>
    n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
    Test data: <<word1 word2, word3>>
    n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
    Test data: <<word1 word2,word3>>
    n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
    Test data: <<word1 word2 , word3>>
    n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>

    一旦“非分配字符类”只接受逗号,您可以将其缩写为格式字符串中的文字逗号:
    int n = sscanf(data, "%19s %31[^, ] , %63s", word1, word2, word3);

    将其插入测试工具会产生与之前相同的结果。请注意,所有代码都受益于审查;即使在它工作之后,它也经常(基本上总是)得到改进。

    关于c - 正确使用 sscanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537072/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com