文字列があり、5 番目の場所から最後の場所までのサブ文字列が必要です。どの機能を使用すればよいですか?
7 に答える
ヘッダーファイルmemcpy()
にある関数を使用できます。string.h
memcpy()
バッファと呼ばれることもあるメモリブロック間でデータのバイトをコピーします。この関数は、コピーされるデータのタイプに関係なく、正確なバイト単位のコピーを作成するだけです。関数のプロトタイプは
void *memcpy(void *dest, void *src, size_t count);
引数 dest と src は、それぞれ転送先と転送元のメモリ ブロックを指します。count は、コピーするバイト数を指定します。戻り値は dest です。
メモリの 2 つのブロックがオーバーラップすると、関数が正しく動作しない可能性があります。コピーされる前に、src 内のデータの一部が上書きされる可能性があります。次に説明する関数を使用して、memmove()
オーバーラップするメモリ ブロックを処理します。memcpy()
以下のプログラムでデモンストレーションします。
これらの関数の例もここにあります: http://www.java-samples.com/showtutorial.php?tutorialid=591
元の文字列を他に使用しない場合は、&s[4]
直接使用できます。コピーが必要な場合は、
char new_str[STR_SIZE + 1] = {0};
strncpy(new_str, &s[4], STR_SIZE);
部分文字列を取得する文字列内の文字もわかっている場合は、strstr 関数を使用できます。部分文字列を見つけます。ただし、取得したい文字がわからない場合は、Eric が述べたように、strcpy または strncpy を使用して文字列を取得できます。
私が正しく理解している場合は、文字列を部分文字列に分割するために、区切り文字を使用する必要があります。たとえば、「one#two#three」は 1 つ 2 つ 3 に分割されます。もしそうなら:
#include <stdio.h>
#include <string.h>
int main()
{
char test[] = "one#two#three";
char* res;
res = strtok(test, "#");
while(res) {
printf("%s\n", res);
res = strtok(NULL, "#");
}
return 0;
}
トークン化する文字列で strtok() を 1 回呼び出します。最初の呼び出しからの文字列を続行するには、次の各呼び出しで NULL を渡す必要があります。また、strtok は元のポインターを変更する可能性があるため、動的に割り当てられる場合は、strtok に渡す前に保存する必要があることに注意してください。