0

私の配列が次の場合:

char* String_Buffer = "Hi my name is <&1> and i have <&2> years old."
char* pos = strpbrk(String_buffer, "<");

今 pos は次のとおりです。

" <&1> と私は <&2> 歳です。 "

しかし、「こんにちは、私の名前は」が必要です。どうすればこれを行うことができますか?

4

2 に答える 2

3

まず、作業している文字列が変更可能なメモリ1にあることを確認します。

char String_Buffer[] = "Hi my name is <&1> and i have <&2> years old."

次に、見つかった位置で文字列をカットします<

char* pos = strpbrk(String_buffer, "<");
if(pos!=NULL)
{
    /* changing the '<' you found to the null character you are actually
     * cutting the string in that place */
    *pos=0;
}

印刷String_Bufferが出力されるようになりHi my name isました。最後のスペースが必要ない場合は、pos要素を 1 つ後ろに移動します ( の先頭より前に移動しないように注意してくださいString_Buffer)。


  1. あなたのコードでは、charポインターを宣言し、変更不可能な文字列リテラルを指すようにしました (そのため、通常は; この場合、代わりにローカル配列を初期化しています。これは、必要なだけ変更できます。 .const char * str = "asdasads";char
于 2012-08-09T16:43:34.953 に答える
2

個別に追跡する場合startは、バッファのセクションを「切り取る」ことができます。

char *start = String_Buffer;
char *end = strpbrk(String_Buffer, "<");

if (end) {
    /* found it, allocate enough space for it and NUL */
    char *match = malloc(end - start + 1);

    /* copy and NUL terminate */
    strncpy(match, start, end - start);
    match[end - start] = '\0';

    printf("Previous tokens: %s\n", match);
    free(match);
} else {
    /* no match */
}

各トークンを印刷するバッファーをウォークするために、これをループに巻き上げるだけです。

char *start = String_Buffer, *end, *match;

while (start) {
    end = strpbrk(start, "<");
    if (!end) {
        printf("Last tokens: %s\n", start);
        break;
    } else if (end - start) {
        match = malloc(end - start + 1);

        /* copy and NUL terminate */
        strncpy(match, start, end - start);
        match[end - start] = '\0';

        printf("Tokens: %s\n", match);
        free(match);

        end++; /* walk past < */
    }

    /* Walk to > */
    start = strpbrk(end, ">");
    if (start) {
        match = malloc(start - end + 1); /* start > end */
        strncpy(match, end, start - end);
        match[start - end] = '\0';

        printf("Bracketed expression: %s\n", match);
        free(match);
        start++; /* walk past > */
    }
}
于 2012-08-09T16:47:38.777 に答える