VS2005では、strcat, strtok関数の新バージョンも導入されています
errno_t strcat_s( char *strDestination, size_t sizeInBytes, const char *strSource );strDestinationには、追加先のバッファを指定します。
sizeInBytesには、追加先バッファのサイズを指定します。
strSourceには、追加する文字列を指定します。
正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。
では、サンプルを見てみましょう。
/* strcat01.c */
#include <stdio.h>
#include <string.h>
int main()
{
char name[32], buf[32];
printf("あなたの苗字は何ですか--- ");
gets_s(buf, sizeof(buf));
printf("名前は何ですか--- ");
strcpy_s(name, sizeof(name), buf);
gets_s(buf, sizeof(buf));
strcat_s(name, sizeof(buf) - strlen(buf) - 1, buf);
printf("あなたの名前は%sさんですね\n", name);
return 0;
}
strcat_s(name, sizeof(buf), buf);ではなく、
strcat_s(name, sizeof(buf) - strlen(buf) - 1, buf);となる点に注意してください。 bufには、すでに苗字が含まれているので、その分とヌル文字の分をひいてやる 必要があります。 実行結果は次のようになります。
strtok関数は、筆者はよく使います。
これもVS2005では、新バージョンが登場しました。
char *strtok_s(
char *strToken,
const char *strDelimit,
char **context
);
strTokenには、切り分けの対象となる文字列を指定します。strDelimitには、区切り文字のセットを指定します。
contextは、内部的にこの関数が利用します。
では、サンプルを見てみましょう。
/* strtok01.c */
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "This is a pen. That is a pen. Here is a book.", seps[] = " .";
char *token, *nexttoken;
token = strtok_s(str1, seps, &nexttoken);
while (token != NULL) {
printf("%s\n", token);
token = strtok_s(NULL, seps, &nexttoken);
}
return 0;
}
実行結果は次のようになります。
引数が一つ増えただけで、使い方従来のstrtok関数と同じですね。
Update May/20/2006 By Y.Kumei