4

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

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

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

4

3 回答 3

3

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

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

[^是转换类型,匹配除列出的字符之外的所有字符,以]

这是测试它的示例程序:

#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;
}
于 2013-08-01T17:39:50.280 回答
0

你需要strtok. 用作~您的分隔符。

请参阅文档: http: //linux.die.net/man/3/strtok

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

编辑:

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

于 2013-08-01T17:39:46.403 回答
0
#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
于 2013-08-01T17:46:24.527 回答