0

私はこの文字列を持っています: char *path = " one\\\two\\\five\\\six";

すべてのセルが文字列の場合、それを配列に分割したい。私strtokの問題は、配列に割り当てるスペースの量を計算することです。

私はそれをやっています:

for ( i = 0 ; i < strlen(path) ; i++)
{
   if (path[i] == '\'  && path[i+1] == '\') /*doesn't work! :( */
      counter++
}

比較行が機能していません...「\」と書いてみましたが、うまくいきません。なにが問題ですか?

編集 strtok を使用しようとしていますが、面倒です:(

     char           seps[]      =   "\\";
     char           *elemName   =   NULL;

 elemName = strtok( path, seps );

 while( elemName != NULL )
     {
          /* While there are tokens in "string" */
         /*copy the elemName*/
         stringArr[runner] = strdup(elemName);
         /* Get next token: */
          elemName = strtok( NULL, seps );
     }
 printf("printing the strings!!!!\n");
 for ( i = 0 ; i < arr_size ; i++)
 {
     printf (" %s \n " , stringArr[i]);
 }
4

6 に答える 6

1

\文字列または文字リテラルの文字はエスケープ文字であることに注意してください ( Yossarianの回答で説明されているように)。これは、コンパイラを含む文字列リテラルがある場合でも、実際の文字列で\\単一に変換されることを意味します。\

したがって、コードに次のものがある場合:

char *path = " one\\two\\five\\six"

それを(例えばでprintf)印刷すると、次のように表示されます。

1\2\5\6

これは、ロジックが間違っていることを意味し、 2 つのバックスラッシュをチェックする必要はありません。また、文字列の末尾を超えて読み取ることを心配する必要がないことも意味します。

于 2012-09-17T11:48:48.200 に答える
1

書き込む必要があります(またはASCII 値'\\'であるため、数値 92 )。はエスケープ文字であり、文字列に含めたい場合は、単独でエスケープする必要があります。\\

説明:\(whatever)コンパイル段階で 1 文字に変換されます。(例: \n-> ASCII 値 0x0A の char)

于 2012-09-17T11:40:22.707 に答える
0

スラッシュをエスケープする必要があります:'\\'バックスラッシュ文字を表します\

于 2012-09-17T11:41:11.090 に答える
0

次のように宣言された文字列:

char * path = "one\\two"

7(+1)文字、'o''n''e''\''t''w''o'('\ 0')があります。これは、単一の円記号をエスケープする必要があるためです。したがって、これだけを使用してください。

if ( path[i] == '\\' ) {
  counter++;
}
于 2012-09-17T11:42:24.953 に答える
0

「\」はエスケープ文字であるため、単一の「\」を使用しても機能しないため、「\」で分割するには「\」を使用します。

于 2012-09-17T11:52:00.960 に答える
0

割り当ての問題について:文字列へのポインターのNULLで終了する配列にのみメモリを割り当てることになっています。

そのため、文字列をループして、区切り記号を数えます。2 + カウントを割り当てる必要があります。区切り文字の次にもう 1 つの文字列があり、さらに 1 つの終了 NULL ポインターがあります。

char **strv = malloc( (2 + count) * sizeof( char*) );

次のステップは、文字列を再度ループし、割り当てたばかりの配列にポインターを設定することです。何かのようなもの:

strv[ i++ ] = string;

for ( pstr = string; *pstr != '\0'; pstr++ ){
    if( *pstr == delimiter ) {
        *pstr = '\0';
        strv[ i++ ] = pstr + 1;
    }
}
strv[ i ] = NULL;

(コードは元の文字列を変更します。) 文字列と割り当てられたポインター配列の両方を解放することを忘れないでください。

「\\」はバックスラッシュが続くエスケープ文字だと思います。したがって、'\\' は 1 文字にすぎません。コードのカウント部分が 2 回カウントされないようにしてください。

-オイステイン

于 2012-09-17T12:07:40.473 に答える