 2006年2月にVisual Studio 2005日本語版がリリースされました。
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特有の関数なので、現在のところ他の 環境では使うことができません。
Update May/02/2006 By Y.Kumei