Cプログラミング

 Computer >> コンピューター >  >> プログラミング >> Cプログラミング
  1. C言語のqsort()とC++のsort()の違いを徹底解説

    本記事では、C言語標準ライブラリの qsort() 関数と、C++ STLが提供する sort() 関数の違いについて詳しく解説します。どちらも配列やコンテナをソートするための機能ですが、内部実装・パフォーマンス・型安全性など、多くの点で大きな差があります。 C言語のqsort()とは C言語には、配列をソートするための qsort() 関数が標準で用意されています。関数のシグネチャは以下の通りです。 void qsort(void *base, size_t num, size_t size, int (*comparator) (const void*, const void*)); この

  2. C/C++のldexp()関数とは?使い方とエラー処理を実例付きで解説

    ldexp()関数の基本本記事では、C/C++で利用できるldexp()関数の役割と具体的な使い方について解説します。ldexp()関数は、指定した値 x に「2のexp乗」を掛けた結果(x × 2exp)を返す数学関数です。引数としては、浮動小数点数の x と整数型の指数 exp の2つを受け取ります。構文ldexp()関数の構文は以下の通りです。引数の型に応じて複数のオーバーロードが用意されています。float ldexp(float x, int exp) double ldexp(double x, int exp) long double ldexp(long double x, i

  3. C/C++のwcstoll()関数とは?ワイド文字列をlong long整数に変換する方法を徹底解説

    wcstoll()関数とはwcstoll()関数は、ワイド文字列(wchar_t型)をlong long型の整数に変換するための標準ライブラリ関数です。変換できなかった最初の文字以降の位置をポインタに格納する機能も備えており、文字列解析に非常に便利です。構文は以下の通りです。long long wcstoll(const wchar_t* str, wchar_t** str_end, int base)引数この関数は3つの引数を受け取ります。str: 変換対象となるワイド文字列の先頭へのポインタです。str_end: 関数によって設定される出力用ポインタです。最後に読み取った有効な文字の次の

  4. 【C/C++】abs・labs・llabs関数の使い方と違いを徹底解説

    C++のcstdlibライブラリ(C言語ではstdlib.h)には、絶対値を求めるための関数が複数用意されています。abs()は主にint型の入力に使用され、C++ではint型・long型・long long型にも対応したオーバーロードが提供されています。一方、labs()やllabs()は、それぞれlong型やlong long型などのより大きな整数データを扱うために用意された関数です。この記事では、これら3つの絶対値関数の使い方と違いを、サンプルコードと実行結果付きでわかりやすく解説します。abs() 関数abs()関数は、int型のデータに対して使用します。引数として渡した値の絶対値を戻

  5. C言語の関数における引数と戻り値の4つのパターン

    本記事では、戻り値と引数の観点から、C言語の関数を分類する方法について詳しく解説します。C言語の関数は、引数を受け取る場合と受け取らない場合があります。同様に、呼び出し元へ何らかの値を返す場合と、何も返さない場合があります。これらを組み合わせると、関数は次の4つのタイプに分類できます。引数なし・戻り値なしの関数引数なし・戻り値ありの関数引数あり・戻り値なしの関数引数あり・戻り値ありの関数例1:引数なし・戻り値なしの関数#include <stdio.h>void my_function() {    printf(This is a func

  6. C言語のkbhit関数とは?使い方・サンプルコードと注意点を解説

    C言語のkbhit関数とは ここでは、C言語における kbhit() 関数の機能について解説します。kbhit は「Keyboard Hit(キーボードヒット)」の略で、その名の通りキーボードのキーが押されたかどうかを検知するための関数です。 この関数は conio.h ヘッダーファイルに宣言されているため、使用する際はコードの先頭で該当ヘッダーファイルをインクルードする必要があります。 kbhit() の動作は非常にシンプルで、キーが押されていれば非ゼロの値を返し、押されていなければゼロを返すというものです。この特性を活かすことで、ユーザーの入力を待ち受けながら、プログラム本体の処理を止める

  7. C言語で入力文字が英字・数字・特殊文字のいずれかを判定する方法

    このセクションでは、C言語において、入力された1文字が英字(アルファベット)・数字・特殊文字のどれに該当するかを判定する方法を解説します。 英字は「A〜Z」および「a〜z」の範囲、数字は「0〜9」の範囲に含まれます。そして、これら以外のすべての文字が特殊文字として分類されます。つまり、この基準に基づいて条件分岐を行えば、入力された文字の種類を簡単に判別できるのです。 判定のロジック 文字の種類を判定する手順は以下の通りです。 文字コードの比較により、大文字(A〜Z)または小文字(a〜z)の範囲内であれば → 英字 0 から 9 の範囲内であれば → 数字 いずれの条件にも該当しなければ →

  8. 【C言語】sizeof()内の関数は実行されない?動作の仕組みを解説

    C言語のsizeof演算子(関数と呼ばれることもあります)は、引数として与えられたデータや型のサイズをバイト単位で計算するために使われます。ここで重要なポイントは、引数に関数が指定された場合でも、その関数自体は実行されないという点です。sizeofはあくまで戻り値の型のサイズだけを評価します。 以下のサンプルコードでは、sizeof()の中にprintf()文を記述してみます。実際に出力される結果を確認しましょう。 サンプルコード #include<stdio.h> double my_function() {    printf("This is a

  9. C/C++で正規分布に従う乱数を生成する方法

    本記事では、正規分布(ガウス分布)に従う乱数をC/C++で生成する方法を解説します。正規乱数は、Box-Muller法と呼ばれる変換公式を使うことで、一様乱数から簡単に求められます。その公式は次の通りです。𝑧 = √−2 ln 𝑥1 cos (2𝜋𝑥2)ここで、x1 と x2 はそれぞれ「0以上1未満」の範囲でランダムに選ばれた一様乱数です。この式によって得られる z は、平均0・標準偏差1の標準正規分布に従います。サンプルコード以下は、この公式を実装したC++のプログラム例です。生成した標準正規乱数に標準偏差(sigma)を掛け、平均値(Mi)を加算することで、任意の平均・分散を持つ

  10. C/C++で入力された文字列が整数(数字のみ)かどうかを判定する方法

    この記事では、ユーザーから入力された文字列が「整数を表す文字列」なのか、それとも通常の文字列なのかを判定する方法を解説します。ここでいう整数文字列とは、すべての文字が 0 ~ 9 の範囲に含まれる文字列のことです。判定の考え方アプローチは非常にシンプルです。文字列の先頭から順に1文字ずつ調べ、その文字が数字であるかどうかを isdigit() 関数でチェックしていきます。すべての文字が数字であれば整数文字列とみなし true を返し、途中に数字以外の文字が1つでも見つかった時点で false を返して処理を終了します。サンプルコード#include <iostream> using

  11. C/C++のlong long型とは?サイズの違いと確認方法を解説

    CやC++では、通常のint型で扱える範囲を超える大きな整数値を処理したい場合に、long や long long 型を使用することがあります。本記事では、long long 型の基本的な特徴と、実際にどれくらいのメモリサイズを持つのかを解説します。 long long型の特徴 long long 型は、long 型よりも多くのメモリを確保できる整数型で、非常に大きな整数値を扱う際に役立ちます。ただし、確保されるメモリサイズは環境(OSやコンパイラ、プラットフォーム)によって異なる点に注意が必要です。 一般的な傾向としては以下のようになります。 Windows環境: long は32ビット(

  12. C/C++における「int main()」と「int main(void)」の違いとは?

    C言語やC++のプログラムを見ていると、main関数の定義には「int main()」と「int main(void)」という2つの書き方があることに気づくことがあります。では、この2つに何か違いはあるのでしょうか? 結論から言うと、C++では両者に違いはありません。また、C言語においてもどちらの書き方も文法的に正しいものです。しかし、技術的には後者の「int main(void)」の方がより明確です。なぜなら、この書き方は「この関数は引数を一切受け取らない」ことを明示的に宣言しているからです。 C言語における重要な注意点 C言語では、関数の引数が指定されていない場合、その関数は引数なしで呼び

  13. C言語のマクロで可変長引数を使う方法(__VA_ARGS__の基本と実践例)

    C言語では、printf()やscanf()のように関数に対して可変長引数(可変個引数)を使用できます。その際には省略記号「...」を記述します。実はマクロでも同様に可変長引数を扱うことが可能です。マクロの場合も引数リストの末尾に「...」を書き、渡された可変引数は特殊な識別子「__VA_ARGS__」で受け取ります。さらに、連結演算子「##」を使うことで、可変引数と他の要素を連結したり、引数が空の場合のカンマを除去したりできます。以下の例では、printf()のように可変長引数を受け取るログ出力マクロを定義しています。このマクロは、ファイル名、行番号、メッセージを整形して出力します。第1引数

  14. C言語における#defineとconstの違いを徹底解説

    はじめにC言語で定数を扱う方法として、#define と const の2つが広く使われています。一見するとどちらも同じ役割を果たすように思えますが、内部の仕組みや挙動には大きな違いがあります。この記事では、それぞれの特徴と違いをわかりやすく解説します。#define の仕組み#define はプリプロセッサディレクティブの一種です。マクロを定義すると、コンパイルが始まる前の前処理段階で、ソースコード内のマクロ名がすべて定義済みの値に置き換えられます。つまり、コンパイラがコードを処理する時点では、マクロはすでに実際の値へと展開されているため、コンパイラはマクロの存在自体を一切認識しません。その

  15. C言語における「char s[]」と「char *s」の違いとは?メモリ配置と書き換え可否を解説

    C言語では、文字列を扱う際に「char s[]」のような配列形式と「char *s」のようなポインタ形式の2つの宣言方法がよく使われます。一見似ているこの2つですが、実際には重要な違いがいくつか存在します。本記事では、その違いをメモリ配置や動作の観点から詳しく解説します。 配列とポインタの基本的な違い まず大前提として、「s[]」は配列であり、「*s」はポインタであるという点が異なります。 例えば、以下の2つの宣言を比較してみましょう。 char s[20] char *s この状態でsizeof()を使ってサイズを確認すると、前者は「20」、後者は「4」という結果になります。 前者が20

  16. C/C++のswitch-case文で範囲を指定して使う方法

    CやC++では、値に応じて処理を分岐させる際にswitch-case文をよく利用します。通常、switch文に渡した値と各caseラベルの値が一致するかどうかを1つずつ確認しますが、実は範囲(range)を指定したcaseを書くことも可能です。caseで範囲を指定する構文は次の通りです。case low ... highcaseキーワードの後に、まず下限値(low)を記述し、その後に半角スペース、3つのドット(...)、さらに半角スペースを挟んで、上限値(high)を続けます。それでは、範囲指定のcase文を使ったプログラムの動作を見てみましょう。サンプルプログラム次のプログラムでは、配列内の

  17. C言語における暗黙の戻り値型intとは?旧仕様の挙動とC99での廃止を解説

    初期のC言語では、関数の戻り値の型(返却型)を明示的に宣言しなかった場合、その関数は自動的に int 型を返すものとして扱われました。これを「暗黙のint(implicit int)」ルールと呼びます。つまり、戻り値の型が省略されていてもコンパイルエラーにはならず、暗黙的に int 型であると解釈されていたのです。 ただし、この挙動はC99規格以降では廃止されました。C99以降では、たとえ戻り値の型が int であっても省略することは許されず、必ず明示的に型を記述する必要があります。 コード例 以下は、古いCコンパイラ(C89以前)で動作する、戻り値の型を省略した関数の例です。 #includ

  18. C言語の入れ子関数(ネストした関数)とは?標準Cでの制限とGCC拡張による実現方法

    一部のアプリケーションのソースコードでは、ある関数の中に別の関数が宣言されている例を見かけることがあります。これは「入れ子関数(ネストした関数)」と呼ばれることもありますが、厳密には入れ子関数ではありません。この構造は「レキシカルスコープ(字句スコープ)」と呼ばれます。C言語ではレキシカルスコープは有効ではありません。その理由は、コンパイラが内側の関数の正しいメモリ位置を特定できないためです。また、入れ子になった関数定義は、外側のブロック内のローカル変数にアクセスすることができず、アクセスできるのはグローバル変数のみです。C言語には「ローカルスコープ」と「グローバルスコープ」という2つのスコー

  19. 【C/C++入門】値渡し・アドレス渡し・参照渡しの違いを徹底解説

    C言語では、関数へパラメータ(引数)を渡す方法として「値渡し(call by value)」と「アドレス渡し(call by address)」の2種類があります。さらにC++では、3つ目の手法である「参照渡し(call by reference)」が利用可能です。この記事では、それぞれの仕組みと動作の違いを、実際のコード例と実行結果をもとにわかりやすく解説します。1. 値渡し(Call by Value)値渡しでは、呼び出し元の変数のコピーが関数の仮引数に渡されます。そのため、関数内でどれだけ値を変更しても、元の変数には一切影響しません。コード例#include <iostream&g

  20. C/C++のメモリリークとは?仕組みと具体例をわかりやすく解説

    メモリリーク(memory leak)とは、プログラマが動的に確保したメモリを適切に解放(free / delete)せずに放置してしまうことで発生する現象です。確保されたメモリは、すでにプログラムから使われていないにもかかわらず、システム上では「使用中」として予約されたまま残ります。このように、何の理由もなくメモリ領域が占有され続ける状態が、メモリリークと呼ばれる所以です。メモリリークが起きると、一部のメモリブロックが無駄に消費されます。システムに十分な空きメモリがある場合でも、リークが蓄積すればパフォーマンスの低下を招き、最悪の場合はメモリ枯渇によるクラッシュにつながることもあります。例1

Total 1445 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:16/73  20-コンピューター/Page Goto:1 10 11 12 13 14 15 16 17 18 19 20 21 22