从sscanf读取,包括空格,打破其他角色

时间:2013-08-01 17:30:13

标签: c fgets scanf

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

  

Carl Sagan~联系~scifi~1997

Author,Name,Genre,year的部分。你可以看到我需要Carl Sagan中的空格,但我需要这个函数来中断波形符号上的字符串。任何帮助表示赞赏

3 个答案:

答案 0 :(得分:2)

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

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;
}

答案 1 :(得分:0)

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

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

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

编辑:

在阅读this之后,听起来你可以巧妙地使用sscanf来获得相同的结果,毕竟它实际上可能更安全。

答案 2 :(得分: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