私の配列が次の場合:
char* String_Buffer = "Hi my name is <&1> and i have <&2> years old."
char* pos = strpbrk(String_buffer, "<");
今 pos は次のとおりです。
" <&1> と私は <&2> 歳です。 "
しかし、「こんにちは、私の名前は」が必要です。どうすればこれを行うことができますか?
私の配列が次の場合:
char* String_Buffer = "Hi my name is <&1> and i have <&2> years old."
char* pos = strpbrk(String_buffer, "<");
今 pos は次のとおりです。
" <&1> と私は <&2> 歳です。 "
しかし、「こんにちは、私の名前は」が必要です。どうすればこれを行うことができますか?
まず、作業している文字列が変更可能なメモリ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
)。
char
ポインターを宣言し、変更不可能な文字列リテラルを指すようにしました (そのため、通常は; この場合、代わりにローカル配列を初期化しています。これは、必要なだけ変更できます。 .const
char * str = "asdasads";
char
個別に追跡する場合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 > */
}
}