C LANGUAGE TECHNOLOGY

【C言語】strcpy/strncpy/strcpy_s関数の使い方と自作関数

悩んでいる人

C言語でstrcpy/strncpy/strcpy_s関数の使い方と自作関数を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

strcpy関数

strcpy関数は,srcが指す文字列を末尾のヌルバイト('\0')も含めてdestが指すバッファにコピーします.

srcとdestの文字列のメモリ領域は重なってはいけません.(未定義の動作になります.)

destはsrcのコピーを受け取るのに十分な大きさが必要です.

strcpy関数の戻り値は,destへのポインタです.

コピーするメモリ領域が重なる場合は,strcpy関数ではなくmemmove関数を利用しましょう.

memmove関数を学びたいあなたはこちらからどうぞ.

C言語 memcpy関数 memmove関数
【C言語】memcpy関数とmemmove関数の違いと自作関数

こういった悩みにお答えします. こういった私から学べます. 目次1 memcpy関数とmemmove関数の違い2 memcpy関数とmemmove関数の利用例3 memcpy関数とmemmove関数の ...

続きを見る

strcpy関数の使い方

strcpy関数を使い方は以下になります.

実行結果は以下になります.

strcpy関数の自作関数

strcpy関数の自作関数は以下になります.

実行結果は以下になります.

strcpy関数の注意点

strcpy関数は,バッファサイズより長い文字をコピーするとバッファオーバーフローが発生することに注意して下さい.

strcpy.cのコードで文字列に「abcdefghijklmnopqrstuvwxyz」を入力した結果は以下になります.

「abcdefghijklmnopqrstuvwxyz」 と'\0'の合計27文字を入力しましたが,BUFSIZEは16なので,以下の6行目でバッファオーバーフローが発生して「*** stack smashing detected ***: terminated」と表示されていることがわかります.

※strcpy.cでは,15行目のscanf関数と17行目のstrcpy関数でバッファオーバーフローが発生しています.

strncpy関数

strncpy関数はstrcpy関数と似ていますが,srcのうち最大でもnバイトしかコピーされない点が異なります.

ただし,srcの最初のnバイトの中にヌルバイトがない場合,destに格納される文字列はヌルで終端されない可能性があることに注意して下さい.

destのn + 1バイト目(配列の添字ではn)にヌルバイトがあればヌルで正常に終端します.

なので,strncpy関数でnバイトコピーした後に,n + 1バイト目にヌルバイトを代入する処理を入れましょう!

そうでなければ,printf関数等でdestを読み込んだ場合,未定義のデータが表示されたり,バッファオーバーリードが発生したりしてしまいます.

strncpy関数の戻り値は,destへのポインタです.

strncpy関数の使い方

strncpy関数の使い方は以下になります.

20行目のstrncpy関数でsrcからnバイト分をdestにコピーした後に,21行目で「dest[n] = '\0';」とヌルバイトを代入しています.

nが15以下であれば,n + 1がdestのサイズの16以下になるので,正常にヌル終端します.

実行結果は以下になります.

3行目に文字列abc,4行目に2を入力することでabcの先頭2バイトのabがdestにコピーされていることがわかります.

strncpy関数の自作関数

strncpy関数の自作関数は以下になります.

実行結果は以下になります.

strcpy_s関数

strcpy_s関数は,srcが指す文字列を末尾のヌルバイトも含めてdestが指すバッファにコピーします.

strcpy関数とは異なり,strcpy_s関数はdestのサイズdest_sizeを第2引数に指定することで,srcをdestに正常にコピーできるかどうかチェックします.

もし正常にコピーできない場合は,abort関数を呼び出します.

strcpy_s関数の戻り値は,正常に終了した場合は0,それ以外の場合はエラーになります.

strcpy_s関数はVisual Studioでは利用できますが,GCC/Clangでは利用できないことに注意して下さい.

strcpy_s関数の使い方

strcpy_s関数の使い方は以下になります.

Visual Studioでの実行結果は以下になります.

strcpy_s関数の自作関数

strcpy_s関数の自作関数は以下になります.

実行結果は以下になります.同様です.

まとめ

C言語でstrcpy/strncpy/strcpy_s関数の使い方と自作関数を紹介しました.

strcpy/strncpy関数はGCC/Clang/Visual Studioで利用できますが,strcpy_s関数はVisual Studioしか利用できないことに注意して下さい.

文字列を追加するstrcat関数を学びたいあなたはこちらからどうぞ.

C言語 strcat関数
【C言語】strcat/strncat/strcat_s関数の使い方と自作関数

こういった悩みにお答えします. こういった私から学べます. 目次1 strcat関数1.1 strcat関数の使い方1.2 strcat関数の自作関数1.3 strcat関数の注意点2 strncat ...

続きを見る

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , , , ,