4

ずさんなタイトルで申し訳ありませんが、質問を正しくフォーマットする方法がわかりませんでした。構造体を埋めるために必要な情報がすべての行に含まれている.txtを読み込もうとしています。最初に行を読んでから、個々の部分を読むfgetsために使用しました。sscanfここで行き詰まっています。通常sscanfは空白の部分を分割しますが、空白を含める必要があります。空白を無視できることはわかっていsscanfますが、難しいのは、パーツを区切るために他の任意の文字が必要になることです。たとえば、私はラインを壊さなければなりません

カール・セーガン~Contact~scifi~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
#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 に答える
0

が必要strtokです。~区切り文字として使用します。

ドキュメントを参照してください: http://linux.die.net/man/3/strtok

strtokいくつかの欠点がありますが、それはあなたのために働くように聞こえます.

編集:

これを読んだ後、同じ結果を達成するために賢く使用できるように思えますがsscanf、実際にはより安全かもしれません.

于 2013-08-01T17:39:46.403 に答える