【C言語】文字列の概念を使って余分な空白を削除するプログラムの作り方
問題概要
実行時に入力された文字列から、余分な空白をすべて取り除くCプログラムを作成します。先頭の空白や連続して並ぶ複数の空白を検出し、各インデックスの文字を順番にチェックしながら、ループ処理によって削除していきます。
解決方法
まず、以下の例で動作イメージを確認しましょう。このプログラムは、文中の先頭の空白および連続する空白を削除し、各単語の間には1つの空白だけを残します。たとえば、単語間に複数の空白が入った文章を入力しても、出力される文字列はきれいに整えられます。
文字列の基本
C言語では、char型の配列を文字列として扱います。文字列の宣言は次の形式で行います。
char stringname[size];
たとえば char string[50]; と宣言すれば、最大50文字の文字列を格納できます。
初期化
- 1文字ずつ文字定数で初期化する方法:
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
- 文字列リテラルで初期化する方法:
char string[10] = "Hello";
文字列へのアクセス
printfやscanfでは制御文字「%s」を使用します。「%s」は、終端文字「'\0'」(NULL文字)に到達するまで文字列を一括して読み書きできる便利な指定子です。
余分な空白を削除するロジック
文字列内の余分な空白を削除するために使用するロジックは以下の通りです。
len = strlen(string);
for(i=0; i<len; i++){
if(string[0]==' '){
for(i=0; i<(len-1); i++)
string[i] = string[i+1];
string[i] = '\0';
len--;
i = -1;
continue;
}
if(string[i]==' ' && string[i+1]==' '){
for(j=i; j<(len-1); j++){
string[j] = string[j+1];
}
string[j] = '\0';
len--;
i--;
}
}
処理の流れを整理すると次のようになります。
- strlen()関数で文字列の長さを取得します。
- 先頭が空白だった場合は、文字列全体を1文字左にずらしてその空白を除去します。
- 隣り合う2文字がどちらも空白だった場合も、同様に左へ詰めて1つ分の空白を削除します。
- これを文字列全体に対して繰り返すことで、余分な空白がすべて取り除かれます。
サンプルプログラム
以下は、文字列の概念を利用して文中の余分な空白を削除するCプログラムの完全なコードです。
#include <stdio.h>
#include <string.h>
int main() {
char string[200];
int i, j, len;
printf("Enter a statement: ");
gets(string);
len = strlen(string);
for(i=0; i<len; i++) {
if(string[0]==' ') {
for(i=0; i<(len-1); i++)
string[i] = string[i+1];
string[i] = '\0';
len--;
i = -1;
continue;
}
if(string[i]==' ' && string[i+1]==' ') {
for(j=i; j<(len-1); j++) {
string[j] = string[j+1];
}
string[j] = '\0';
len--;
i--;
}
}
printf("\nNew String after removing extra spaces is = %s", string);
return 0;
}
※ strlen() を使用するため、<string.h> のインクルードが必要です。また、元のコードにある getch() はWindows環境専用(conio.hが必要)のため、移植性を考慮して省略しています。さらに、gets() はバッファオーバーフローの危険がある非推奨関数なので、実際の開発では fgets() の使用をおすすめします。
実行結果
上記のプログラムをコンパイルして実行すると、次のような出力が得られます。
Enter a statement: Welcome to The world of C programming New String after removing extra spaces is = Welcome to The world of C programming
このように、入力文に連続した空白が含まれていても、実行後には各単語が1つの空白で区切られた整った文字列が出力されます。
-
C言語でO(1)の追加メモリ領域のみを使ってn×nのスパイラル行列を出力する方法
正の整数 n が与えられたとき、追加の作業用メモリを O(1) しか使用せずに、時計回り方向の n×n スパイラル行列を生成して出力する方法を解説します。スパイラル行列とは、円の原点から出発し、時計回りに渦を描くように値を埋めていく行列のことです。ここでは、2 → 4 → 6 → 8 → 10 → 12 → 14 → 16 → 18 というように偶数を渦状に配置した行列を、O(1) の空間計算量で出力することを目標とします。以下にスパイラル行列の例を示します。実行例入力: 3 出力: 9 8 7 2 1 6 3 4 1メモリを無制限に使えばこの問題は簡単に解けますが、そ
-
Pythonで再帰を使って文字列を反転させるプログラムの書き方
再帰(リカージョン)の手法を使って文字列を逆順に並べ替えたい場合は、ユーザー定義の関数を再帰と組み合わせて実装します。再帰とは、大きな問題をより小さな単位に分割してそれぞれの結果を計算し、それらを組み合わせることで最終的な答えを導き出す手法です。文字列の反転においても、この考え方をそのまま応用できます。コード例以下に実際のプログラム例を示します。def reverse_string(my_string): if len(my_string) == 0: r