C++のstrlen関数を使った文字列操作5選

strlen関数の使用方法を徹底解説するイメージC++
この記事は約18分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C++を学び始めたばかりのあなたにとって、プログラミング言語の中でも特に基本的な関数の一つであるstrlen関数の使い方を理解することは、非常に重要です。

この記事では、C++におけるstrlen関数の使い方を初心者目線で徹底解説します。

文字列の長さを取得するこの関数の基本的な使い方から、よくあるエラーへの対処法、さらには実用的な応用例まで、サンプルコードを交えながらわかりやすく説明していきます。

プログラミングにおいて正確な文字列操作は避けて通れないため、この機能をマスターすることで、さらに多くのプログラムを理解しやすくなります。

●strlen関数とは

strlen関数は、C++(およびC言語)で使用される標準的なライブラリ関数の一つで、null終端文字列(’\0’で終わる文字列)の長さを計算するために使われます。

この関数はまたはヘッダーファイル内で定義されており、文字列の先頭のポインタを引数として受け取り、先頭からnull文字が現れるまでの文字の数を整数として返します。

この戻り値はsize_t型で、文字列の長さを表しますが、終端のnull文字は長さに含まれません。

○strlen関数の基本

strlen関数の基本的な使い方を示す前に、正確な関数のプロトタイプを見てみましょう。

プロトタイプは次の通りです。

#include <cstring> // strlen関数を使用するために必要
size_t strlen(const char* str);

ここで、const char* strは、調べたい文字列の先頭を指すポインタです。

基本的な使用例としては、ある文字列の長さを測定してみます。

このサンプルコードでは、文字列"hello"の長さを測定し、結果を出力しています。

#include <iostream>
#include <cstring> // strlen関数を使用するために必要

int main() {
    const char* myString = "hello";
    size_t length = strlen(myString);
    std::cout << "Length of '" << myString << "' is " << length << " characters." << std::endl;
    return 0;
}

このコードを実行すると、"hello"の長さである5が出力されます。

この簡単な例からわかるように、strlen関数は特に文字列の長さを知りたい場合に非常に役立ちます。

●strlen関数の使い方

strlen関数を効果的に使用するためには、いくつかの実用的な例を理解することが重要です。

この関数は単純ながらも、プログラミングにおける多くの場面で役立つツールです。

例えば、ユーザー入力の検証や、特定のフォーマットのテキストデータを処理する際に、文字列の長さを事前に確認することが必須となる場合があります。

○サンプルコード1:単純な文字列の長さを測定する

前に紹介した基本的な使用例をさらに発展させ、複数の文字列の長さを比較する簡単なプログラムを見てみましょう。

このコードでは、二つの異なる文字列の長さを測定し、それらを比較しています。

#include <iostream>
#include <cstring>

int main() {
    const char* string1 = "Hello, world!";
    const char* string2 = "Hello, C++!";

    size_t length1 = strlen(string1);
    size_t length2 = strlen(string2);

    std::cout << "Length of '" << string1 << "' is " << length1 << " characters." << std::endl;
    std::cout << "Length of '" << string2 << "' is " << length2 << " characters." << std::endl;

    if (length1 > length2) {
        std::cout << "'" << string1 << "' is longer." << std::endl;
    } else if (length1 < length2) {
        std::cout << "'" << string2 << "' is longer." << std::endl;
    } else {
        std::cout << "Both strings are of equal length." << std::endl;
    }

    return 0;
}

この例では、文字列の長さを比較することで、どちらが長いかをユーザーに伝える方法を示しています。

プログラミング初心者にとっては、このような基本的な操作がプログラムの流れを理解する上で大いに役立ちます。

○サンプルコード2:配列に保存された文字列の長さを確認する

プログラム内で文字列の配列を扱う場合、各文字列要素の長さが異なる可能性があるため、それぞれの長さを確認する必要があります。

このコードは、文字列の配列から各要素の長さを測定し、出力しています。

#include <iostream>
#include <cstring>

int main() {
    const char* greetings[] = {"Hello", "Bonjour", "こんにちは", "안녕하세요"};
    int numGreetings = sizeof(greetings) / sizeof(greetings[0]);

    for (int i = 0; i < numGreetings; ++i) {
        size_t length = strlen(greetings[i]);
        std::cout << "Length of '" << greetings[i] << "' is " << length << " characters." << std::endl;
    }

    return 0;
}

このコードでは、異なる言語の挨拶を含む配列を用いており、各挨拶の文字列長を確認しています。

プログラムが多言語のデータを扱う際の一例として参考になります。

○サンプルコード3:ユーザー入力の文字列長を測定する

実際のアプリケーションでは、ユーザーからの入力を受け取り、その長さをチェックすることがしばしばあります。

この例では、ユーザーから文字列を入力してもらい、その長さを測定しています。

#include <iostream>
#include <cstring>

int main() {
    std::string userInput;
    std::cout << "Please enter a string: ";
    std::getline(std::cin, userInput);

    size_t length = strlen(userInput.c_str());
    std::cout << "Length of your input is " << length << " characters." << std::endl;

    return 0;
}

このコードではstd::getline関数を使って標準入力から文字列を読み取り、std::stringc_str()メンバ関数を使ってCスタイルの文字列に変換後、その長さを測定しています。

○サンプルコード4:strlen関数を使った条件分岐

strlen関数は、特定の条件に基づいてプログラムの流れを制御するのにも役立ちます。

例えば、ユーザーが入力した文字列が一定の長さを超えた場合に警告を出す、といった処理が考えられます。

#include <iostream>
#include <cstring>

int main() {
    std::string userInput;
    std::cout << "Enter a string (max 10 characters): ";
    std::getline(std::cin, userInput);

    size_t length = strlen(userInput.c_str());
    if (length > 10) {
        std::cout << "Warning: Your input is too long!" << std::endl;
    } else {
        std::cout << "Thank you for your input." << std::endl;
    }

    return 0;
}

この例では、入力された文字列が10文字を超える場合に警告メッセージを表示しています。

これにより、ユーザーに対して入力制限を設けることができ、プログラムの堅牢性を高めることが可能です。

●よくあるエラーと対処法

プログラミングにおいてエラーは避けられないもので、特にC++での文字列操作においては、典型的なエラーが発生しやすいです。strlen関数を使用する際にも特有の注意が必要です。

最も一般的なエラーの一つは、未初期化の文字列ポインタをstrlen関数に渡すことです。

この操作は未定義の挙動を引き起こし、プログラムのクラッシュにつながることがあります。

strlen関数は渡されたポインタが指す先のメモリからnull文字を探すまでメモリを読み続けるため、初期化されていないポインタが指す先のメモリはランダムなデータであり、予期せぬ場所にnull文字が見つからない場合があります。

○NULL文字列を扱う際の注意

NULLポインタをstrlenに渡すことは、C++標準によって未定義の挙動とされています。

多くの実行環境では、これが原因でランタイムエラーが発生します。

プログラム内で文字列の長さを測る前には、ポインタがNULLではないことを確認する必要があります。

#include <iostream>
#include <cstring>

int main() {
    const char* myString = nullptr; // 未初期化を意図的に示す
    // NULLチェックを行う
    if (myString != nullptr) {
        std::cout << "String length is " << strlen(myString) << std::endl;
    } else {
        std::cout << "String pointer is null." << std::endl;
    }

    return 0;
}

このコードは、myStringがNULLかどうかをチェックしてからstrlenを呼び出しているため、安全に処理を行うことができます。

○文字列が未初期化の場合の対処

未初期化の文字列を扱う場合のもう一つの一般的な対処法は、文字列を宣言する際に明示的に初期化を行うことです。

C++では、文字列を初期化しないと、そのメモリ領域には以前にそのメモリを使用していたプログラムの残留データが含まれることがあります。

#include <iostream>
#include <cstring>

int main() {
    const char* myString = ""; // 空の文字列で初期化

    std::cout << "String length is " << strlen(myString) << std::endl;

    return 0;
}

この例では、myStringを空の文字列で初期化しています。

これにより、strlen関数が適切に0を返すことが保証されます。

常にポインタを適切に初期化することで、多くのランタイムエラーを避けることができます。

●よくあるエラーと対処法

C++でのプログラミングでは、特に文字列処理に関連して多くのエラーが発生することがあります。

これは、メモリの扱いやポインタ操作の複雑さに起因します。

ここでは、strlen関数を使用する際によく遭遇するエラーとその対処法を紹介します。

○NULL文字列を扱う際の注意

strlen関数は、引数として渡された文字列がNULLポインタである場合に、セグメンテーションフォルトを引き起こす可能性があります。

この関数は、終端のNULL文字(’\0’)を見つけるまでメモリを読み続けるため、不正なメモリアクセスが発生することが原因です。

したがって、strlenを呼び出す前には、ポインタがNULLでないことを確認することが重要です。

例えば、このようなコードでは、ポインタがNULLであるかどうかを確認し、安全にstrlenを使用しています。

#include <iostream>
#include <cstring>

int main() {
    const char* myString = nullptr; // 例としてNULLポインタを設定
    if (myString != nullptr) {
        size_t length = strlen(myString);
        std::cout << "Length of the string is " << length << std::endl;
    } else {
        std::cout << "The string is null." << std::endl;
    }
    return 0;
}

このコードは、myStringがNULLの場合にstrlenの呼び出しを避け、エラーを防いでいます。

○文字列が未初期化の場合の対処

文字列が適切に初期化されていない場合、不定の値を持つことになり、これが予期せぬ動作を引き起こすことがあります。

C++では、ローカル変数を初期化しないと、その値は不定(ガベージ値)です。

strlen関数を使用する前に文字列を初期化することで、この問題を回避できます。

#include <iostream>
#include <cstring>

int main() {
    const char* myString = "";  // 空の文字列で初期化する
    size_t length = strlen(myString);
    std::cout << "Length of the string is " << length << std::endl;
    return 0;
}

この例では、myStringを空の文字列で初期化しています。

これにより、strlenが正しく0を返し、不定値による未定義の挙動を防いでいます。

このように、変数を宣言する際には常に初期化を心掛けることが重要です。

●strlen関数の応用例

strlen関数は、C++プログラミングにおいて基本的だが非常に強力なツールです。

文字列の長さを測定するこの関数は、様々なシナリオで応用することが可能です。

今回は、その応用例のいくつかを紹介します。

まずは、ファイルから読み込んだ文字列が特定の形式に合致しているかどうかを検証する場合の例です。

ファイルから一行ずつ読み込み、読み込んだ行が特定の長さであることを確認する必要があります。

このような時、strlen関数は非常に有用です。

○サンプルコード5:動的に確保したメモリの文字列操作

動的にメモリを確保した文字列を操作する際、その長さを確認することは、メモリの安全性を保つ上で重要です。

このサンプルコードは、動的に確保した文字列の長さを測る方法を表しています。

#include <iostream>
#include <cstring>

int main() {
    char* myString = new char[50];  // 50文字分のメモリを動的に確保
    std::strcpy(myString, "Hello, dynamic world!");
    size_t length = strlen(myString);
    std::cout << "Length of the string is " << length << " characters." << std::endl;
    delete[] myString;  // 使用後のメモリを解放
    return 0;
}

このコードでは、動的に確保したメモリ領域に文字列を保存し、その後でstrlen関数を使用して文字列の長さを確認しています。

プログラムの安全性を保つため、使用後には必ずメモリを解放することが重要です。

○サンプルコード6:複数の文字列を組み合わせた長さの計算

複数の文字列を組み合わせて、最終的な文字列の長さを計算することも一般的な使い方の一つです。

例えば、ユーザーからの入力を受け取り、それを既存のデータと組み合わせる場合に便利です。

#include <iostream>
#include <cstring>

int main() {
    const char* greeting = "Hello, ";
    const char* name = "John Doe";
    size_t greetingLength = strlen(greeting);
    size_t nameLength = strlen(name);
    size_t totalLength = greetingLength + nameLength;  // 文字列の長さを合計

    std::cout << "Total length of combined string is " << totalLength << " characters." << std::endl;
    return 0;
}

このサンプルでは、二つの異なる文字列を組み合わせた際の合計長を計算しています。

strlen関数を使用することで、個々の文字列の長さを簡単に取得し、それを合計することができます。

●エンジニアなら知っておくべき豆知識

エンジニアとして成功するためには、テクニカルスキルだけでなく、役立つ豆知識も知っておくことが重要です。

特にプログラミングにおいては、細かいテクニックやコーディングのベストプラクティスを把握することが、効率的な開発へとつながります。

ここでは、特にC++におけるstrlen関数を用いたテクニックをいくつか紹介します。

○文字列操作の効率化

プログラム内で文字列操作を頻繁に行う場合、効率化は非常に重要です。

strlen関数は、文字列の長さを取得する際に非常に便利ですが、その使用方法には注意が必要です。

例えば、ループ内でstrlen関数を呼び出すと、ループの度に文字列の長さを計算するため、パフォーマンスが低下する可能性があります。

#include <iostream>
#include <cstring>

int main() {
    const char* exampleString = "Example string for length measurement.";
    int length = strlen(exampleString);  // 文字列の長さを事前に計算

    for (int i = 0; i < length; i++) {
        std::cout << exampleString[i];
    }
    std::cout << std::endl;

    return 0;
}

このコード例では、ループを開始する前に一度だけstrlen関数を呼び出し、計算された長さを使用しています。

これにより、ループの各反復でstrlenを呼び出す必要がなくなり、実行効率が向上します。

○セキュリティ上の注意点

セキュリティはソフトウェア開発において無視できない要素です。

特に、外部からの入力を扱う際には、バッファオーバーフローのリスクを常に意識する必要があります。

strlen関数を使用する際にも、セキュリティを考慮したコーディングが求められます。

例えば、外部からの入力を受け取る際には、入力サイズのチェックを行うことが重要です。

#include <iostream>
#include <cstring>

int main() {
    char buffer[100];
    std::cout << "Enter a string: ";
    std::cin.getline(buffer, 100);  // ユーザ入力を100文字まで受け取る

    size_t length = strlen(buffer);
    if (length > 99) {
        std::cerr << "Input is too long!" << std::endl;
    } else {
        std::cout << "Length of your input: " << length << " characters." << std::endl;
    }

    return 0;
}

この例では、std::cin.getlineを使用してユーザ入力を安全に受け取り、指定されたバッファサイズを超えないようにしています。

これにより、バッファオーバーフローを防ぐことができます。

まとめ

この記事では、C++におけるstrlen関数の使い方から応用例までを詳しく解説しました。

文字列の長さを取得する基本的な方法から、エラーハンドリング、効率的な文字列操作のテクニックまで、幅広い情報を紹介しました。

プログラミング初心者から中級者までが、実際のコーディングに活かせる知識を得ることができる内容となっています。

効率的なコードの書き方を学ぶことは、プログラミングスキルを向上させる上で非常に重要です。