第125章 文字列を取り扱う新しい関数 その1


2006年2月にVisual Studio 2005日本語版がリリースされました。

内部的に大幅な変更があったようです。セキュリティが大変厳しくなりました。



char szName[8];
...
gets(szName);
などというプログラムは警告が出ます。

ユーザーが意図的に大きな文字列を入力すると、プログラムがハングアップして重大な結果を招くからです。では、どうしたらよいのでしょうか。

マイクロソフトでは、安全性の高い新しい関数を導入しました。gets関数であれば、gets_s関数です。

char *gets_s( 
   char *buffer,
   size_t sizeInCharacters
);
sizeInCharactersには、バッファサイズを指定します。

簡単なサンプルを見てみましょう。

/* gets01.c */

#include <stdio.h>

int main()
{
    char szName[32];

    printf("What is your name?---");
    gets_s(szName, sizeof(szName) - 1); 
    printf("Your name is %s.\n", szName);

    return 0;
}

実行結果は下の図のようになります。



次に文字列をコピーするとき使うstrcpy関数も、新バージョンがあります。

errno_t strcpy_s(
   char *strDestination,
   size_t sizeInBytes,
   const char *strSource 
);
strDestination は、コピー先のバッファです。 sizeInBytesは、コピー先バッファサイズです。 strSourceは、元の文字列です。 これも、ちょっとサンプルを見てみましょう。
/* strcpy01.c */

#include <stdio.h>
#include <string.h>

int main()
{
    char line[32], name[32];

    printf("What's your name? --- ");
    gets_s(line, sizeof(line) - 1);
    strcpy_s(name, sizeof(name), line);
    printf("Your name is %s.\n", name);

    return 0;
}
実行結果は、gets01.cの場合と同じです。

特別難しくはありませんが、始めてコンパイルしたとき警告やらエラーが 出るとびっくりしてしまいますね。

なお、gets_sとかstrcpy_s関数はVS2005特有の関数なので、現在のところ他の 環境では使うことができません。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update May/02/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。