内部的に大幅な変更があったようです。セキュリティが大変厳しくなりました。
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