C言語で文字列をコピーしたいな。strcpyを使おうとしたらエラーが出た😭
良く分からないよ…
こちらの悩みを解決していきます。
本記事の内容
・文字列の操作をする関数
・strcpyとは?
・strncpyとは?
・strcmpとは?
この記事を書いている自分は情報系大学生で、三ヶ月ほどでC言語の基礎を完璧に理解しました。勉強中に分からないことが多く、一日中プログラミングしていたこともあります。
今では、ブログでC言語について解説しています。
今回はそんな経験をもとに解説していこうかと。
当サイトでは、覚えるべきところを全てまとめているので、画面を撮影して何度も読み返すことをおすすめします。
それでは、解説していきます!
文字列の操作をする関数
文字列の操作ができる関数を3つ紹介します。
✔文字列の操作ができる関数
- strcpy
- strcnpy
- strcmp
この3つの関数を使うには「string.h」をインクルードする必要があります。ヘッダーファイルのインクルードをする方法はこちらを参考にしてください。
»C言語 入門 乱数の発生方法(疑似乱数じゃない!)stdio.h
ではまず、3つの関数をまとめてみます。
関数名 | 使い方 | 意味 |
---|---|---|
strcpy | strcpy(〇,×) | ×を〇にコピー |
strncpy | strncpy(〇,×,△) | ×の先頭から△文字を〇にコピー |
strcmp | strcmp(〇,×) | 〇と×の文字列の比較 |
〇と×は、文字列の代入されている配列だと思ってください。上から順に解説していきます。
strcpyとは?
配列内の文字列をコピーするには、「strcpy」という関数を使う必要があります。
Visual Studioを使用している方は、strcpyを使う時、プログラムの先頭に
#define _CRT_SECURE_NO_WARNINGS
を書く必要があります。
もしくは、使用する関数を「strcpy」から「strcpy_s」に変更しましょう。でないとエラーが出てしまい、プログラムを実行できません。
stcpy_sとは?
strcpy_sとは、Visual Studioでstrcpyを使ってエラーが出た際に代わりとして使う関数ですね。
stcpyのサンプルコード
「strcpy_s」の使い方は「strcpy」と同じなので、「strcpy」を使ったプログラムを紹介します。「name」という配列に代入された文字列を「copy」という配列にコピーして出力します。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char name[10]= {"BlogMuu"};
char copy[10];
strcpy(copy,name);
printf("%s",copy);
}
このプログラムでは「BlogMuu」と出力されます。
これはセキュリティ上の問題によりSDLチェックというものが発生してしまうからですね。その他のSDLチェック回避の方法は下の記事を参考にしてください。
»C言語 入門 scanfの使い方とは?(エラーの対処法も)
strncpyとは?
配列の先頭から指定した文字数分だけコピーするときは、「strncpy」という関数を使う必要があります。
strcpyと同様、Visual Studioを使用している方は、プログラムの先頭に
#define _CRT_SECURE_NO_WARNINGS
を書く必要があります。もしくは、「strncpy」を「strncpy_s」に変更する必要があります。
strncpy_sとは?
strncpy_sとは、Visual Studioでstrncpyを使ってエラーが出た際に代わりとして使う関数ですね。
strncpy_sのサンプルコード
strncpyとstrncpy_sの使い方は同じです。ここでは、「strncpy_s」を使ったプログラムを紹介していきます。
#define N 4
#include<stdio.h>
#include<string.h>
int main()
{
char name[10]= { "BlogMuu" };
char copy[10];
strncpy_s(copy,name,N);
copy[N] = '¥0';
printf("%s",copy);
}
実行すると「Blog」と出力されます。
気を付けるべきポイントは、コピーされた側の配列の最後に「¥0」を入れることです。
¥0を最後に入れないと文字列の後に余計な文字列が代入されているため、「Blog」のあとに余計な文字列が出力されてしまいます。
このプログラムのように「マクロ」を使えば簡単に「¥0」を代入できるのでまねしてみてください。
「マクロ」の使い方はこちらの記事を参考にしてください。
strcmpとは?
2つの配列内の文字列が同じであるかを調べるには、「strcmp」という関数を使う必要があります。2つの配列に同じ文字列が代入されていたら「strcmp」は「0」として扱うことができます。
この関数を使う際は、プログラムの先頭に
#define _CRT_SECURE_NO_WARNINGS
は必要ないです。そのまま「strcmp」でOKです!
strcmpのサンプルコード
「strcmp」を使って、配列内の文字列が同じであるかを調べるプログラムをつくりましょう。
#include<stdio.h>
#include<string.h>
int main()
{
char name[10]= { "BlogMuu" };
char copy[10] = { "BlogMuu" };
if (strcmp(copy, name) == 0)
{
printf("name==copy");
}
else
{
printf("name!=copy");
}
}
if文とうまく組み合わせれば、strcmp==0のときに「name==copy」が出力され、strcmp!=0のときに「name!=copy」が出力されるプログラムをつくれます。
このプログラムを実行すると「name==copy」と出力されます。
まとめ:文字列のコピーをする関数3つ紹介!
今回の重要なところをまとめますね。
関数名 | 使い方 | 意味 |
---|---|---|
strcpy | strcpy(〇,×) | ×を〇にコピー |
strncpy | strncpy(〇,×,△) | ×の先頭から△文字を〇にコピー |
strcmp | strcmp(〇,×) | 〇と×の文字列の比較 |
また、途中で話したSDLチェックについてもう一度確認してみましょう。SDLチェックは、C言語をVisual Studioで使うと稀にあることですね。
今回は以上です!
文字列のコピーなどができる関数をまとめて解説しました。他にも文字列の関数を解説しているのでぜひ参考にしてください。
ではでは~👋
コメント