【C言語】指定文字数ごとに改行する方法を解説

C言語でプログラムを書くとき、長い文字列を見やすくするために指定した文字数ごとに改行したいことがあります。

この記事では、初心者向けにその方法をわかりやすく解説します。

目次から探す

基本的な考え方

C言語で指定文字数ごとに改行する方法を理解するためには、まず基本的な文字列操作の知識が必要です。

ここでは、文字列操作の基本、文字列の長さを取得する方法、そして改行文字の挿入方法について解説します。

文字列操作の基本

C言語では、文字列は文字の配列として扱われます。

文字列の終端は必ずヌル文字(\0)で示されます。

例えば、文字列 Hello は以下のようにメモリに格納されます。

H e l l o \0

文字列を操作するためには、標準ライブラリの string.h を利用します。

このライブラリには、文字列のコピー、結合、比較などの関数が含まれています。

文字列の長さを取得する方法

文字列の長さを取得するためには、strlen関数を使用します。

この関数は、文字列の長さ(ヌル文字を含まない)を返します。

以下に例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    int length = strlen(str);
    printf("The length of the string is: %d\n", length);
    return 0;
}

このプログラムを実行すると、文字列 Hello, World! の長さが表示されます。

The length of the string is: 13

改行文字の挿入方法

指定文字数ごとに改行を挿入するためには、文字列をループで走査し、指定した文字数に達したら改行文字(\n)を挿入します。

以下にその基本的な方法を示します。

#include <stdio.h>
#include <string.h>
void insert_newlines(char *str, int interval) {
    int length = strlen(str);
    for (int i = 0; i < length; i++) {
        if (i > 0 && i % interval == 0) {
            printf("\n");
        }
        printf("%c", str[i]);
    }
    printf("\n");
}
int main() {
    char str[] = "This is a sample string to demonstrate the insertion of newlines.";
    int interval = 10;
    insert_newlines(str, interval);
    return 0;
}

このプログラムでは、文字列 This is a sample string to demonstrate the insertion of newlines. を10文字ごとに改行します。

実行結果は以下のようになります。

This is a 
sample str
ing to dem
onstrate t
he inserti
on of newl
ines.

このようにして、指定した文字数ごとに改行を挿入することができます。

次のセクションでは、実装のステップについて詳しく解説します。

実装のステップ

必要なライブラリのインクルード

C言語で文字列操作を行うためには、標準ライブラリをインクルードする必要があります。

特に、文字列操作に関する関数が含まれている <string.h> と、入出力操作に関する関数が含まれている <stdio.h> をインクルードします。

#include <stdio.h>
#include <string.h>

文字列の入力と出力

文字列を操作するためには、まず文字列を入力し、その結果を出力する方法を理解する必要があります。

ここでは、標準入力からの文字列取得とファイルからの文字列取得の方法について説明します。

標準入力からの文字列取得

標準入力から文字列を取得するには、scanf関数fgets関数を使用します。

scanf関数は空白文字で区切られた入力を取得しますが、fgets関数は改行文字までの入力を取得します。

#include <stdio.h>
int main() {
    char str[100];
    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin); // 標準入力から文字列を取得
    printf("入力された文字列: %s", str);
    return 0;
}

ファイルからの文字列取得

ファイルから文字列を取得するには、fopen関数でファイルを開き、fgets関数で文字列を読み取ります。

#include <stdio.h>
int main() {
    FILE *file;
    char str[100];
    file = fopen("example.txt", "r"); // ファイルを読み取りモードで開く
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    while (fgets(str, sizeof(str), file) != NULL) {
        printf("%s", str); // ファイルから読み取った文字列を出力
    }
    fclose(file); // ファイルを閉じる
    return 0;
}

文字数カウントと改行挿入のロジック

文字列を指定文字数ごとに改行するためには、文字数をカウントし、指定した文字数に達したら改行文字を挿入するロジックが必要です。

ループを使った文字数カウント

文字列の各文字をループで走査し、文字数をカウントします。

ここでは、for ループを使用します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "これはテストの文字列です。指定文字数ごとに改行します。";
    int length = strlen(str); // 文字列の長さを取得
    int count = 0;
    for (int i = 0; i < length; i++) {
        count++;
        if (count == 10) { // 10文字ごとに改行
            printf("\n");
            count = 0;
        }
        printf("%c", str[i]);
    }
    return 0;
}

条件分岐による改行挿入

指定した文字数に達したら改行文字を挿入するために、条件分岐を使用します。

上記の例では、if文を使用して10文字ごとに改行しています。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "これはテストの文字列です。指定文字数ごとに改行します。";
    int length = strlen(str); // 文字列の長さを取得
    int count = 0;
    for (int i = 0; i < length; i++) {
        count++;
        if (count == 10) { // 10文字ごとに改行
            printf("\n");
            count = 0;
        }
        printf("%c", str[i]);
    }
    return 0;
}

このようにして、指定した文字数ごとに改行を挿入することができます。

上記の例では、10文字ごとに改行していますが、任意の文字数に変更することも可能です。

応用例

ここでは、指定文字数ごとに改行する基本的な方法を応用して、さらに複雑なシナリオに対応する方法を解説します。

複数行の文字列を扱う場合

複数行の文字列を扱う場合、各行ごとに指定文字数で改行を挿入する必要があります。

以下のサンプルコードでは、複数行の文字列を入力として受け取り、各行ごとに指定文字数で改行を挿入します。

#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 100
#define WRAP_LENGTH 10
void wrap_line(char *line, int wrap_length) {
    int len = strlen(line);
    for (int i = 0; i < len; i++) {
        putchar(line[i]);
        if ((i + 1) % wrap_length == 0) {
            putchar('\n');
        }
    }
    putchar('\n');
}
int main() {
    char line[MAX_LINE_LENGTH];
    printf("複数行の文字列を入力してください(終了するにはCtrl+Dを押してください):\n");
    while (fgets(line, sizeof(line), stdin)) {
        wrap_line(line, WRAP_LENGTH);
    }
    return 0;
}

このプログラムでは、標準入力から複数行の文字列を受け取り、各行ごとに指定文字数(この例では10文字)で改行を挿入します。

特定の文字で改行する場合

特定の文字(例えばスペースやカンマ)で改行を挿入したい場合もあります。

以下のサンプルコードでは、スペースで改行を挿入する方法を示します。

#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 100
void wrap_line_at_space(char *line) {
    int len = strlen(line);
    for (int i = 0; i < len; i++) {
        putchar(line[i]);
        if (line[i] == ' ') {
            putchar('\n');
        }
    }
    putchar('\n');
}
int main() {
    char line[MAX_LINE_LENGTH];
    printf("スペースで改行する文字列を入力してください(終了するにはCtrl+Dを押してください):\n");
    while (fgets(line, sizeof(line), stdin)) {
        wrap_line_at_space(line);
    }
    return 0;
}

このプログラムでは、入力された文字列のスペースごとに改行を挿入します。

動的メモリを使った実装

動的メモリを使うことで、入力文字列の長さに制限を設けずに処理することができます。

以下のサンプルコードでは、動的メモリを使って指定文字数ごとに改行を挿入します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WRAP_LENGTH 10
void wrap_line(char *line, int wrap_length) {
    int len = strlen(line);
    for (int i = 0; i < len; i++) {
        putchar(line[i]);
        if ((i + 1) % wrap_length == 0) {
            putchar('\n');
        }
    }
    putchar('\n');
}
int main() {
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    printf("動的メモリを使って文字列を入力してください(終了するにはCtrl+Dを押してください):\n");
    while ((read = getline(&line, &len, stdin)) != -1) {
        wrap_line(line, WRAP_LENGTH);
    }
    free(line);
    return 0;
}

このプログラムでは、getline関数を使って動的にメモリを確保し、入力された文字列を処理します。

これにより、入力文字列の長さに制限がなくなります。

以上の応用例を通じて、指定文字数ごとに改行する基本的な方法をさらに発展させることができます。

これらの方法を組み合わせることで、さまざまなシナリオに対応することが可能です。

目次から探す