ID非公開

2022/1/23 4:45

44回答

c言語でstrtok関数を使用して分解した文字列へは変更がかかるのは理解しましたが、変更させない、または変数を元に戻す方法はないのでしょうか?

C言語関連91閲覧

ベストアンサー

0

その他の回答(3件)

0

以下のようにstrtokを使うと元の文字列は変更されてしまいます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>#include <string.h>int main() { static const char delim[] = ",."; // https://www.cplusplus.com/reference/cstring/strtok/ から引用 char s[] = "A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters."; for (char* p = strtok(s, delim); p; p = strtok(NULL, delim)) printf("\"%s\"\n", p); printf("元の文:\"%s\"", s); } 以下のようにstrspnとstrcspnを使うと元の文字列は変更されません。 #include <stdio.h>#include <string.h>int main() { static const char delim[] = ",."; // https://www.cplusplus.com/reference/cstring/strtok/ から引用 static const char s[] = "A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters."; for (const char* p = s;;) { p += strspn(p, delim); const size_t word_length = strcspn(p, delim); if (word_length) { printf("\"%.*s\"\n", (int)word_length, p); p += word_length; } else break; } printf("元の文:\"%s\"", s); } 《解説》 strspn 関数は区切り文字群の長さを得ます。 strcspn 関数は非区切り文字群の長さを得ます。 printf("%.*s", 長さ, 文字列); このようにすると文字列の先頭から指定した長さだけを出力することが出来ます。 上の方へ: 解説の文章内で書き間違いがありました。ご指摘ありがとうございます。

0

変更しなければ文字列の「切り出し」として機能しません。 また、作用させている変数を書き換えたときにstrtok()の動作は多分保証されないと思います。 strtok()にはリエントラントでないなどの問題(にならないこともあるが)もあることですし、strchr()関数等を使って自分の用途に合った関数を作ればよいのではないですか。

1

(ID非公開) 変更された所は'\0'で埋められるのでその部分を元に戻せば復元できますが、コピーを取ってそれを使った方がいいのでは?

1人がナイス!しています