C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【初心者向け】C/C++で発生する5種類のエラーの原因と対処法を解説

    CやC++でプログラムを作成していると、さまざまな種類のエラーに直面します。これらのエラーは、発生するタイミングや原因によって大きく5つのタイプに分類できます。構文エラー(Syntax Error)実行時エラー(Run-Time Error)リンカーエラー(Linker Error)論理エラー(Logical Error)意味エラー(Semantic Error)以下、それぞれのエラーについて詳しく見ていきましょう。構文エラー(Syntax Error)C++の記述ルールや構文に違反した場合に発生するエラーです。このエラーはコンパイル前にコンパイラによって検出されるため、「コンパイル時エラー」

  2. C言語のgetopt()関数を使ったコマンドライン引数の解析方法

    getopt()は、コマンドラインオプションを受け取るために用意されているC言語の標準関数の一つです。プログラムに渡された引数の中から、-iや-f ファイル名のようなオプション指定を簡単に取り出すことができます。 getopt()関数の構文 getopt(int argc, char *const argv[], const char *optstring) 各引数の意味は以下の通りです。 argc: main関数に渡された引数の総数 argv: 引数文字列の配列 optstring: オプションとして受け付ける文字のリスト。1文字が1つのオプションに対応します 戻り値とグローバル変数 g

  3. C/C++のmbrtowc()関数とは?マルチバイト文字列をワイド文字に変換する方法

    mbrtowc()関数は、マルチバイト文字列(マルチバイトシーケンス)をワイド文字に変換するための標準ライブラリ関数です。「mbrtowc」は「multibyte restartable to wide character」の略で、名前の通り変換状態(mbstate_t)を保持しながら再開可能な変換を行える点が特徴です。この関数は、変換に成功すると入力から消費したマルチバイト文字のバイト数を戻り値として返します。構文は以下の通りです。mbrtowc(wchar_t* wc, const char* s, size_t max, mbstate_t* ps)引数の説明wc:変換結果のワイド文字を

  4. GDBを使ってC/C++のセグメンテーションエラーを特定する方法

    セグメンテーションエラーとはセグメンテーションエラー(Segmentation Fault)は、実行時に発生するエラーの一つで、メモリへの不正なアクセスが原因で起こります。代表的な発生要因としては、以下のようなケースが挙げられます。無効な配列インデックスへのアクセスNULLポインタや未初期化ポインタの参照アクセスが制限されているアドレス領域への読み書き本記事では、デバッガツール「GDB」を使用して、この種のエラーを効率的に検出・特定する手順を解説します。サンプルコードまずは、意図的にセグメンテーションエラーを発生させるサンプルコードを見てみましょう。#include <stdio.h&g

  5. C/C++で高精度に実行時間を測定する方法(chronoライブラリ活用)

    プログラムのパフォーマンスを正確に評価するには、処理にかかる時間を高精度に測定することが重要です。C++では、標準ライブラリのchronoを利用することで、ナノ秒単位という非常に高い精度で実行時間を計測できます。 chronoライブラリの高解像度クロック chronoライブラリには、高解像度クロック(std::chrono::high_resolution_clock)が用意されています。このクロックはシステムが提供する最も精度の高い時計を使用するため、ナノ秒単位での時間計測が可能です。 基本的な測定の流れは以下のとおりです。 処理開始直前に現在時刻を取得する 処理終了直後に再度現在時刻を取

  6. C言語で指定した範囲内の乱数を生成する方法

    この記事では、C言語を使って指定した範囲内の乱数を生成する方法を解説します。乱数の生成には srand() 関数と rand() 関数を使用し、srand() のシード(種)には現在の時刻を設定することで、実行するたびに異なる乱数列を得られるようにします。基本的な考え方標準ライブラリの rand() 関数は、0 から定義された最大値(RAND_MAX)までの乱数しか生成できず、任意の範囲を直接指定することはできません。そこで、次のようなテクニックを使います。まず、0 ~ (上限 − 下限 + 1) の範囲で乱数を生成します。これは rand() % (r - l + 1) という剰余演算で実現

  7. C++14の一般化ラムダ式(ジェネリックラムダ)の使い方を解説

    C++11ではラムダ式が導入されました。ラムダ式とは、他の関数呼び出しの中に直接記述できる無名関数のことで、コードの一部としてその場で定義・利用できます。さらにautoキーワードと組み合わせることで、ラムダ式を変数に格納し、後から再利用することも可能です。 C++14では、このラムダ式がさらに強化されました。それが一般化ラムダ式(ジェネリックラムダ)です。従来のC++11のラムダ式では、引数の型を明示的に指定する必要がありましたが、一般化ラムダ式では引数の型にautoを使えるようになり、1つのラムダ式で複数の異なる型に対応できるようになりました。 例えば、「整数同士の加算」「浮動小数点数同士の

  8. C言語で実現する自己破壊コードの作り方

    C言語では、実行後に自分自身の実行ファイルを削除する「自己破壊コード」を作成することができます。自己破壊コードとは、プログラムを実行した後、その実行ファイル自体を削除してしまう仕組みを持つコードのことです。自己破壊コードの仕組みこのタスクの実装は非常にシンプルです。ポイントは、削除対象となる実行ファイルの名前を取得することです。ここで活用できるのがコマンドライン引数です。C言語では、main関数の第2引数であるargv[0]に実行ファイル名が格納されます。この値を使えば、自分自身のファイルパスを特定できます。あとは標準ライブラリのremove()関数を呼び出すだけで、そのファイルを削除すること

  9. C言語でPOSIXセマフォを使用する方法【初心者向け解説】

    セマフォ(semaphore)は、プロセスやスレッドの同期を実現するための重要な概念です。本記事では、実際のC言語プログラムでPOSIXセマフォをどのように使用するのかを、サンプルコードと実行結果を交えて解説します。 POSIXセマフォとは セマフォは、複数のプロセスやスレッドが共有リソースに同時にアクセスすることを防ぎ、排他制御や同期を実現するための仕組みです。クリティカルセクション(同時に実行してはいけない処理領域)へのアクセスを制御する際によく使われます。 準備:ヘッダーファイルとコンパイル方法 Linuxシステムでは、POSIXセマフォライブラリを利用できます。使用するには、まず se

  10. C言語で独自のヘッダーファイル(.h)を作成して使う方法を解説

    この記事では、C言語で自分専用のヘッダーファイルを作成し、プログラムから利用する方法を解説します。 ヘッダーファイルの作り方 ヘッダーファイルを作るには、拡張子が .h のファイルを新規作成します。ヘッダーファイルには main() 関数は含めません。代わりに、複数のプログラムで共有したい変数や関数の宣言・定義を記述します。 たとえば「my_header.h」という名前のファイルを作成し、以下のように変数と関数を定義できます。 int MY_VAR = 10; int add(int x, int y){ return x + y; } int sub(int x, int y){

  11. クライアントサーバーモデルを用いたC/C++による文字列反転の実装方法

    本記事では、クライアントとサーバーで構成されるシステムを作成する方法を解説します。クライアントが文字列をサーバーへ送信すると、サーバーがその文字列を反転(リバース)し、結果をクライアントに返却するという仕組みです。ソケットプログラミングの基本このシステムではソケットプログラミングの概念を利用します。クライアントとサーバー間の接続を確立するためには、ポートを作成する必要があります。ポート番号はソケットが使用できる任意の数値であり、接続を確立するにはクライアントとサーバーの両方で同じポート番号を使用しなければなりません。今回は例としてポート番号 4000 を使用します。コンパイルと実行の手順プログ

  12. C++のstringstream(文字列ストリーム)とは?基本の使い方と実践例を解説

    本記事では、C++におけるstringstream(文字列ストリーム)について詳しく解説します。stringstreamは、文字列オブジェクトをストリームとして扱うためのクラスで、<sstream>ヘッダをインクルードすることで利用できます。stringstreamを使うと、cinから入力を読み込むのと同じように、文字列をあたかもストリームであるかのように操作できます。これにより、文字列の解析や数値変換などを直感的なコードで実現できます。stringstreamの主なメソッドstringstreamには、以下のような主要なメソッドや演算子が用意されています。clear():ストリー

  13. C++で文字列を16進数(バイナリコード)に変換して隠す方法

    本記事では、文字列をバイナリコード(ここでは16進数で表現)に変換して隠す方法を解説します。この手法は、文字列の各文字をASCIIコード経由で16進数に変換するというシンプルなものです。基本的な考え方アプローチは非常にシンプルです。まず、C++の文字列ストリーム(stringstream)を使用すると、10進数を簡単に16進数へ変換できます。具体的な手順は以下の通りです。1. 元の文字列から1文字ずつ読み取る2. 各文字のASCII値を取得する3. そのASCII値を16進数に変換する4. 変換結果を順番に出力するこの処理を文字列の長さ分だけ繰り返すことで、文字列全体を16進数の羅列として表現

  14. C/C++におけるヌル終端文字列とは?仕組みと挙動を解説

    ヌル終端文字列とはC言語では、文字列は基本的に「文字の配列」として表現されます。C++のstd::stringは、その文字配列をより扱いやすく発展させたクラスであり、従来の文字配列にはない便利な機能が数多く追加されています。ヌル終端文字列(null terminated string)とは、文字の並びの最後にヌル文字「\0」を1つ置いた文字列のことです。ソースコード内でダブルクォート(...)を使って文字列を記述すると、コンパイラによって自動的にヌル終端文字列として扱われます。ヌル文字があると文字列はそこで終わる文字列の実際の長さは、配列全体のサイズよりも短くなることがあります。そして重要なの

  15. C++でstd::stringをトリミング(前後の空白削除)する最良の方法

    C++における文字列のトリミングとは本記事では、C++で文字列をトリミングする方法を詳しく解説します。「トリミング」とは、文字列の左端および右端に含まれる空白文字(スペースやタブなど)を取り除く処理のことです。標準ライブラリだけでも実装は可能ですが、ここではより手軽で信頼性の高い「Boost文字列アルゴリズムライブラリ」を利用します。このライブラリには、trim_left() と trim_right() という2つの便利な関数が用意されており、両方を組み合わせることで文字列の両端を完全にトリミングできます。各関数の役割boost::trim_left(): 文字列の先頭(左側)にある空白を削

  16. C/C++でfloatとdoubleを比較する最も効果的な方法とは?

    この記事では、C言語やC++で2つのfloat型またはdouble型の浮動小数点数を比較する方法について解説します。浮動小数点数の比較は、整数の比較とは性質が大きく異なるため、注意が必要です。なぜ単純な等号比較ではいけないのか浮動小数点数は内部で2進数として表現されるため、誤差が生じる可能性があります。そのため、==演算子による直接比較は期待どおりの結果にならないことがあります。正確に比較するには、「許容誤差(イプシロン)」を考慮に入れる必要があります。例えば、3.1428と3.1415という2つの数値を考えてみましょう。精度0.01で見れば両者は同じ値とみなせますが、精度0.001で見ると異

  17. 【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説

    C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons

  18. C++におけるextern "C"の効果とは?名前マングリングの仕組みと使い方を解説

    extern Cは、C++で定義した関数名にC言語のリンケージ(結合規則)を持たせるためのキーワードです。この指定を行うと、コンパイラは関数名に対して「名前マングリング」を行わなくなります。本記事では、まずC++における名前マングリングの仕組みを確認したうえで、extern Cキーワードの働きと具体的な活用方法を詳しく解説します。 C++の名前マングリングとは C++には「関数オーバーロード」という機能があり、同じ名前の関数でも、引数の型や引数の数が異なっていれば複数定義できます。なお、戻り値の型はオーバーロードの判別対象にはなりません。 ここで一つの疑問が生じます。オブジェクトコード上では、

  19. C++のコピー初期化と直接初期化の違いとは?コピーコンストラクタと代入演算子を解説

    C++におけるコピー初期化は、コピーコンストラクタの仕組みを利用して行われます。コンストラクタはオブジェクトを初期化するための特別なメンバ関数であり、独自のコピーコンストラクタを定義すれば、既存のオブジェクトの値を使って現在のオブジェクトを初期化できます。つまり、「他のオブジェクトのコピー」を作成するための仕組みです。一方、直接初期化は、代入演算子「=」を用いた代入操作によって行われます。 両者の主な違い:メモリの扱い この2つの初期化方法の最も重要な違いは、メモリの扱い方です。コピー初期化では、新しいオブジェクトのために独立したメモリブロックが新たに確保され、そこへ既存オブジェクトの値が複製

  20. C++の関数・メソッドにおけるinlineキーワードの使い方と書くべきタイミング

    C++におけるinlineキーワードは、さまざまな場面で使用されます。具体的には、inline変数の作成、inline名前空間の宣言、そしてinline関数(メソッド)の定義などが挙げられます。inline関数とは何かC++のinline関数は、特にクラスと組み合わせてよく使われる強力な概念です。関数をinlineとして宣言すると、コンパイラはコンパイル時に、その関数が呼び出される各箇所へ関数本体のコードのコピーを直接埋め込みます。この仕組みには注意点もあります。inline関数に変更を加えた場合、その関数を利用しているすべてのコードの再コンパイルが必要になることがあります。これは、コンパイラ

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:59/300  20-コンピューター/Page Goto:1 53 54 55 56 57 58 59 60 61 62 63 64 65