2017年10月02日
《その62》 strcat関数,strncat関数(p.314演習8-10)
strcat関数,strncat関数
strcat関数や strncat関数は、<cstring>ヘッダで提供されています。
strcat関数や strncat関数を含むコードを VC++ でコンパイルしようとすると、安全でない可能性があるという警告が出ます。
VC++ はコンパイルもしないので、
『 _CRT_SECURE_NO_WARNINGS 』を使うなどの対応が必要です。
※ 『 _CRT_SECURE_NO_WARNINGS 』については、このブログの《その60》に説明があります。
【 strcat関数 】
ヘッダ : #include <cstring>
形 式 : char* strcat(char* s1, const char* s2);
解 説 : s2 が指す文字列を、s1 が指す配列の末尾に連結する。
連結元と連結先が重なる場合の動作は定義されない。
返却値 : 連結後のs1
strcat関数は s1の容量を考慮しないようなので、注意が必要です。
【 strncat関数 】
ヘッダ : #include <cstring>
形 式 : char* strncat(char* s1, const char* s2, size_t n);
解 説 : s2 が指す文字列を、s1 が指す配列の末尾に連結する。
s2 の長さが n より長い場合は、切り捨てる。
連結元と連結先が重なる場合の動作は定義されない。
返却値 : 連結後のs1
新版明解C++入門編 p.314 演習8-10
p.310 で学習した strcat関数および strncat関数と同等な関数を作成せよ。
『strcat関数と同等な関数』
strcat関数と同等な関数の名前を strcat_eq とします。
// p314_演習8-10_strcat
#include <iostream>
using namespace std;
char* strcat_eq(char* s1, const char* s2)
{
char *p = s1;
while (*s1) // *s1 == '\0' になるまで s1++
s1++;
while (*s1++ = *s2++) // *s2 == '\0' になるまで *s1++ = *s2++
;
return p;
}
int main()
{
char str1[128] = "ABCDEF"; // ★ 十分な容量を確保
char str2[] = "abc";
cout << strcat_eq(str1, str2) << '\n';
}
『strncat関数と同等な関数』
strncat関数と同等な関数の名前を strncat_eq とします。
// p314_演習8-10_strncat
#include <iostream>
using namespace std;
char* strncat_eq(char* s1, const char* s2, size_t n)
{
char *p = s1;
while (*s1) // *s1 == '\0' になるまで s1++
s1++;
while (n--) { // n == 0 になるまで n--
if (!*s2) // *s2 == '\0' になったら break
break;
*s1++ = *s2++; // *s1 = *s2 の代入をしてから s1++; s2++;
}
*s1 = '\0'; // 終端に'\0'を追加
return p;
}
int main()
{
char str1[128] = "ABCDEF"; // ★ 十分な容量を確保
char str2[] = "#stuvwxyz";
strncat_eq(str1, str2, 5);
cout << str1 << '\n';
strncat_eq(str1, str2, 20);
cout << str1 << '\n';
strncat_eq(str1, str2, 1000);
cout << str1 << '\n';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6766648
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック