0

私はCにかなり慣れていないので、次のような文字列を解析する関数を作成しようとしています:

「これ(ここでは 5 つのスペース)(ここでは 1 つのスペース) (ここで2 つのスペース)の文字列です。」

関数ヘッダーには、渡された文字列へのポインターが次のように含まれます。

bool Class::Parse( unsigned char* string )

最後に、単語間のスペースの数に関係なく各単語を解析し、単語を動的配列に格納したいと思います。

ばかげた質問を許してください...しかし、各文字を反復処理している場合、これを行う最も効率的な方法は何でしょうか? それが文字列の保存方法ですか?したがって、反復を開始する場合:

while ( (*string) != '\0' ) {

--print *string here--

}

それは印刷ですか?

T
h
i... etc?

何卒よろしくお願い申し上げます。

4

3 に答える 3

1

http://www.cplusplus.com/reference/clibrary/cstring/strtok/から

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-"); /* split the string on these delimiters into "tokens" */
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-"); /* split the string on these delimiters into "tokens" */
  }
  return 0;
}

分割文字列「- これは、サンプル文字列です。」トークンに:

This 
a 
sample 
string 
于 2011-06-02T19:13:49.917 に答える
0

私はCで自明でない構文解析をしません、それはあまりにも面倒です、言語はそれに適していません。しかし、C ++を意味し、Class :: Parseを作成したので、そのように見える場合は、再帰下降パーサーを作成するのは非常に簡単であり、車輪の再発明を行う必要はありません。たとえば、コンパイラがC ++ 0xをサポートしている場合は、SpiritまたはAXEを使用できます。たとえば、AXのパーサーは数行で記述できます。

// assuming you have 0-terminated string
bool Class::Parse(const char* str)
{
    auto space = r_lit(' ');
    auto string_rule = "This" & r_many(space, 5) & space & 'a' & r_many(space, 2) 
        & "string" & r_end();
    return string_rule(str, str + strlen(str)).matched;
}
于 2011-06-02T20:38:41.177 に答える
0

まず第一に、C にはクラスがありません。そのため、C プログラムでは、次のいずれかのようなプロトタイプを使用して関数を定義することになるでしょう。

char ** my_prog_parse(char * string) { 
/* (returns a malloc'd array of pointers into the original string, which has had
 * \0 added throughout ) */
char ** my_prog_parse(const char * string) {
/* (returns a malloc'd NULL-terminated array of pointers to malloc'd strings) */
void my_prog_parse(const char * string, char buf, size_t bufsiz,
                      char ** strings, size_t nstrings)
/* builds a NULL-terminated array of pointers into buf, all memory 
   provided by caller) */

ただし、C++ で C スタイルの文字列を使用することは完全に可能です...

ループを次のように書くことができます

while (*string) { ... ; string++; }

最新の最適化コンパイラでまったく同じアセンブラにコンパイルされます。はい、これは C スタイルの文字列を反復処理する正しい方法です。

関数strtokstrchrstrstr、およびstrspn... を見てみましょう。そのうちの 1 つがソリューションの構築に役立つ場合があります。

于 2011-06-02T19:21:32.120 に答える