【C言語】strncat関数でソース文字列からn文字を宛先文字列へ連結する方法
C言語では、strncatという標準ライブラリ関数を使うことで、ソース文字列(連結元)から指定したn文字分だけを、宛先文字列(連結先)へ連結できます。本記事では、strncatの基本的な使い方を、strcatとの違いや具体的なサンプルコード・実行結果とあわせて解説します。
問題
C言語のstrncatライブラリ関数を使用して、ソース文字列からn文字を宛先文字列へ連結するプログラムを作成してください。
解決策
strcat関数とは
まず、比較のためstrcat関数の基本をおさらいしておきましょう。
- 2つの文字列を結合(連結)するための関数です。
- 連結後の文字列が収まるよう、宛先側の配列には十分な大きさの領域を確保しておく必要があります。
- 連結結果は、宛先文字列側に格納されます。
構文
strcat(宛先文字列, ソース文字列);
サンプルコード(例1)
#include <string.h>
main(){
char a[50] = "Hello";
char b[20] = "Good Morning";
clrscr();
strcat(a, b);
printf("concatenated string = %s", a);
getch();
}
実行結果
Concatenated string = HelloGood Morning
この例では、「Hello」と「Good Morning」がそのまま連結され、「HelloGood Morning」という1つの文字列になります。
strncat関数とは
- 一方の文字列から先頭のn文字だけを、もう一方の文字列へ連結するための関数です。
- 連結後の文字列が収まるよう、宛先側の配列には十分な大きさの領域が必要です。
- 連結結果は、宛先文字列側に格納されます。
構文
strncat(宛先文字列, ソース文字列, n);
サンプルコード(例2)
#include <string.h>
main(){
char a[30] = "Hello";
char b[20] = "Good Morning";
clrscr();
strncat(a, b, 4);
a[9] = '\0';
printf("concatenated string = %s", a);
getch();
}
実行結果
Concatenated string = HelloGood
第3引数に4を指定しているため、ソース文字列「Good Morning」の先頭4文字「Good」だけが「Hello」の後ろに連結されます。
サンプルコード(例3)
#include<stdio.h>
#include<string.h>
void main(){
// ソース文字列と宛先文字列を宣言 //
char source[45], destination[50];
// ユーザーから2つの文字列を入力してもらう //
printf("Enter the source string :");
gets(source);
printf("Enter the destination string before :");
gets(destination);
// 入力された文字列をもとに連結処理を行う //
destination[2]='\0';
strncat(destination, source, 2);
strncat(destination, &source[4], 1);
// 宛先文字列を表示 //
printf("The modified destination string :");
puts(destination);
}
実行結果
Enter the source string :TutorialPoint Enter the destination string before :C Programming The modified destination string :C Tur
例3の処理の流れ
このプログラムでは、次の手順で文字列が組み立てられています。
destination[2] = '\0'により、宛先文字列「C Programming」を2文字目で打ち切り、「C 」(Cと半角スペース)にします。strncat(destination, source, 2)により、ソース文字列「TutorialPoint」の先頭2文字「Tu」が連結され、「C Tu」になります。strncat(destination, &source[4], 1)により、ソース文字列の5文字目「r」が1文字だけ連結され、最終的に「C Tur」が出力されます。
注意点
- gets() の使用について:gets() はバッファオーバーフローを引き起こす危険性があるため、C11規格で廃止されました。実務では
fgets()の使用を推奨します。 - clrscr()・getch() について:これらはTurbo Cなど古い開発環境固有の関数です。GCCなどの現代的なコンパイラでは使えないため、不要であれば削除するか、
getchar()などで代替してください。 - バッファサイズの確保:連結後の文字列(終端のNULL文字を含む)が宛先配列に必ず収まるよう、十分なサイズを確保してください。
まとめ
strcatは文字列全体を連結するのに対し、strncatは先頭からn文字だけを連結できる点が大きな違いです。文字列の一部分だけをつなぎたい場合にstrncatは非常に便利ですが、宛先バッファのサイズ管理や、廃止されたgets()の代替としてfgets()を使うなど、安全性への配慮も忘れないようにしましょう。
-
Swiftで文字列の最後の4文字を抽出する方法|substringとsuffixの使い方を解説
Swiftで文字列の末尾から4文字を抽出したい場合、Stringクラスが標準で提供している機能を活用できます。Swiftはバージョンアップのたびにメソッドの追加・非推奨化・改善が繰り返されてきたため、同じ目的を実現するための手段も複数存在します。本記事では、バージョンごとの代表的な抽出方法をサンプルコード付きでわかりやすく解説します。方法1:substringを使う(Swift 3)Swift 3では、substring(from:)メソッドを使って文字列の一部を切り出すことができました。文字列の終了インデックスからオフセットを指定することで、末尾の文字を取得できます。var Str1 = &
-
Pythonで文字列から特定の文字を削除する方法【replace・正規表現・translate】
replace()メソッドで文字を削除する基本の方法Pythonの文字列(str型)には、部分文字列を別の文字列へ置き換えるためのreplace()メソッドが用意されています。削除したい文字を空文字列()に置き換えることで、その文字を取り除くことができます。>>> Hello people.replace(e, ) Hllo popl正規表現(re.sub)で複数の文字を一度に削除する1行のコードで複数種類の文字をまとめて削除したい場合は、正規表現モジュール re を使うのがおすすめです。削除したい文字を「|」(OR条件)で区切って指定し、re.sub(置換対象パターン, 置