【问题标题】:Read from line with sscanf, including whitespaces, breaking on other character使用 sscanf 从行读取,包括空格、中断其他字符
【发布时间】:2013-08-01 17:30:12
【问题描述】:

我很抱歉标题草率,但我不知道如何正确格式化我的问题。我正在尝试阅读 .txt,其中每一行都有填充结构所需的信息。首先我使用fgets 读取行,然后我打算使用sscanf 读取各个部分。现在这是我卡住的地方:通常sscanf 会断开空格上的部分,但我需要包含空格。我知道sscanf 允许忽略空格,但棘手的部分是我需要一些其他任意字符来分隔这些部分。比如我要换行

卡尔·萨根~联系~科幻~1997

分成Author,Name,Genre,year 的部分。您可以看到我需要Carl Sagan 中的空格,但我需要断开波浪字符上的字符串的函数。任何帮助表示赞赏

【问题讨论】:

    标签: c fgets scanf


    【解决方案1】:

    如果您的输入由~ 或例如任何特定字符分隔: 使用这个:

    sscanf(s, "%[^~]", name);
    

    [^ 为转换类型,匹配除所列字符以外的所有字符,以] 结尾

    这是用于测试的示例program

    #include <stdio.h>
    
    int main(int argv, char **argc)
    {
        char *s = "Carl Sagan~Contact~scifi~1997";
        char name[100], contact[100], genre[100];
        int yr;
    
        sscanf(s, "%99[^~]~%99[^~]~%99[^~]~%d", name, contact, genre, &yr);
        printf("%s\n%s\n%s\n%d\n", name, contact, genre, yr);
    
        return 0;
    }
    

    【讨论】:

    • 像魅力一样工作!我还不知道那个 ^ 技巧,谢谢!
    • 如果年份 (int) 介于名称和流派之间,我将如何处理?
    • 由于~不是一个有效的数字scanf("%[^~]~%d~%[^~]", name, &amp;nyr, genre);,所有像~这样明确指定的字符都被scanf匹配。
    • 建议sscanf(s, "%99[^~]~%99[^~]~%99[^~]~%d",... 避免缓冲区溢出。 (在这个例子中显然不会发生,但作为一种良好的编程习惯。)
    【解决方案2】:

    您需要strtok。使用~ 作为分隔符。

    查看文档:http://linux.die.net/man/3/strtok

    strtok 有一些缺点,但听起来它对你有用。

    编辑:

    看完this,听起来你可以巧妙地使用sscanf来达到同样的效果,毕竟它实际上可能更安全。

    【讨论】:

      【解决方案3】:
      #include <stddef.h>
      #include <string.h>
      #include <stdio.h>
      
      char* mystrsep(char** input, const char* delim)
      {
        char* result = *input;
        char* p;
      
        p = (result != NULL) ? strpbrk(result, delim) : NULL;
      
        if (p == NULL)
          *input = NULL;
        else
        {
          *p = '\0';
          *input = p + 1;
        }
      
        return result;
      }
      
      int main()
      {
        char str[] = "Carl Sagan~Contact~scifi~1997";
        const char delimiters[] = "~";
        char* ptr;
        char* token;
      
          ptr = str;
        token = mystrsep(&ptr, delimiters);
        while(token)
          {
            printf("%s\n",token);
             token = mystrsep(&ptr, delimiters);
          }   
        return 0;
      }
      

      输出:-

      Carl Sagan
      Contact
      scifi
      1997
      

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 2012-06-06
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 2017-08-14
        相关资源
        最近更新 更多