C 言語で文字配列を出力する

胡金庫 2023年10月12日
  1. for ループを使って C 言語で文字配列を出力する
  2. 指定子 %s を用いて printf を用いて C 言語で文字配列を表示する
C 言語で文字配列を出力する

この記事では、C 言語で文字配列を出力する方法について複数の方法を紹介します。

for ループを使って C 言語で文字配列を出力する

配列の要素を個別に出力して、より詳細に出力をフォーマットしたい場合は、for ループが最もわかりやすい解決策です。このメソッドの重要な前提条件は、配列の長さを事前に知っておくことです。

while ループのような他の反復メソッドを利用することもできますが、その場合は、反復を停止すべき値を知っておく必要があります。

次の例では、for ループメソッドを用いて、6 文字配列に対して正確に 6 回の反復処理を行うことを示します。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
  char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};

  printf(STR(arr1) ": ");
  for (int i = 0; i < 6; ++i) {
    printf("%c, ", arr1[i]);
  }
  printf("\b\b\n");

  exit(EXIT_SUCCESS);
}

出力:

arr1: a, b, c, d, e, f

指定子 %s を用いて printf を用いて C 言語で文字配列を表示する

関数 printf はフォーマットされた出力を行うための強力な関数です。これは型指定子を用いて入力変数を操作し、それに対応して変数を処理することができます。

すなわち、char 配列は内部的には C スタイルの文字列と同じ構造を持っていますが、C スタイルの文字列は常に \0 バイトで終点を示します。char 配列の最後にヌルバイトを追加すれば、一行の printf コールで配列全体を出力することができます。

終端のヌルバイトを指定せずにこのメソッドで printf を呼び出すと、プログラムがメモリ領域にアクセスしようとする可能性があり、セグメンテーションエラーになる可能性が高いです。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
  char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
  char arr2[] = {'t', 'r', 'n', 'm', 'b', 'v', '\0'};

  printf("%s\n", arr1);
  printf("%s\n", arr2);

  exit(EXIT_SUCCESS);
}

出力:

abcdeftrnmbv
trnmbv

ご覧のように、ヌルターミネータが指定されていない arr1 を出力すると、ヌルターミネータが 1つになるまで文字数が増えていきます。

関数 printf を特殊化するもう一つの方法は、%s 指定子の中に文字列の文字数を渡すことです。これを行う一つの方法は、文字列の長さを %s の間に整数で静的にハードコードするか、あるいは * シンボルに置き換えて printf パラメータから別の整数の引数を取ることです。どちらの方法も、指定子に数字やアスタリスクの前に . 文字が含まれていることに注意してください。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
  char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
  char arr2[] = {'t', 'r', 'n', 'm', 'b', 'v', '\0'};

  printf("%.6s\n", arr1);
  printf("%.*s\n", (int)sizeof arr1, arr2);

  exit(EXIT_SUCCESS);
}

出力:

abcdef
trnmbv
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Array