C/C++プログラミング入門 – 文字列の入力

この記事は1年以上前に掲載されたものです。 情報が古い場合がありますのでお気を付け下さい。

C/C++プログラミング入門 – ループ処理ではループ処理について説明を行った。今回はC言語及びC++における文字列の入力について説明を行いたい。

C言語

C言語で文字列の入力を行う場合、参考として以下のコードが挙げられる。

サンプルコード

[code lang=”c”]#include <stdio.h>
#include <stdlib.h>

int main() {
const int bufSize = 1000;
char *buf = (char *)calloc(sizeof(char), bufSize);
puts("文字列を入力してください。");
fgets(buf, bufSize, stdin);
printf("入力された文字列: %s", buf);
free(buf);
return EXIT_SUCCESS;
}[/code]

解説

C言語では通常、文字列を扱う型自体は存在せず、通常はchar型の配列あるいはchar型のポインターとして使用する必要がある。今回はchar型のポインターとして定義した上で、1000個分の配列と同等のサイズのchar型を動的に割り当てた。

今回はメモリーの割り当てにcallocを使ったが、これはメモリーの割り当ての時に0に置き換えることを想定したことによるものである。単純にメモリーを割り当てる場合、malloc関数を使うこともできる。ただし、malloc関数は単純にメモリーを割り当てるだけでメモリーの内容は初期化しないため、使用する時にはその点で気をつける必要がある1

今回、コンソールからの文字列の読み取りにはfgetsを使用した。引数には(文字列のポインタ, 読み取るサイズ, 入力ストリーム)の順番となる。コンソールから読み取る場合は最後の引数にはstdinを指定すれば良い。

なお、fgetsでは改行文字が含まれるため、改行文字を含まない形にしたい場合、なんらかの処理を行って改行コードを除去する必要がある2 。基本的には改行コードをNULL文字に置き換えることで対処可能である。

改行コードをNULL文字に置き換え、入力ストリームをクリアする例

[code lang=”c”]str[100];

fgets(str, 1000, stdin);

// 改行文字が含まれているかの確認
if (strchr(str, ‘\n’) != NULL) {
// 改行文字を終端記号に置換する
str[strlen(str) – 1] = ‘\0’;
} else {
// 入力ストリームをクリアする
while(getchar() != ‘\n’);
}[/code]

C++

C++では、より容易に記述することが可能である。

サンプルコード

[code lang=”cpp”]#include <iostream>
#include <sstream>
#include <string>
#include <cstdlib>

using namespace std;

int main() {
cout << "文字列を入力してください。" << endl;
string str;
getline(cin, str);
cout << "入力された文字列: " << str << endl;
return EXIT_SUCCESS;
}[/code]

解説

C++ではstd::stringが文字列を扱うクラスとなっており、それを利用して比較的容易に文字列を扱うことができる。

std::getline関数は引数としては(入力元のストリーム, 入力先の文字列の参照)となっているほか、引数は参照渡しとなっているため、通常の変数のようにstrを渡しただけで、入力した文字列が変数strに反映されることになる。なお、値渡し・ポインタ渡し・参照渡しについては後ほど取り上げたい。ここではgetlineの引数に指定した文字列に入力した文字列が反映されたことだけが最低限わかれば問題ない。

なお、前述のfgetsとは違い、getlineでは改行コードは自動的に除去されている点が大きく異なることに要注意である。C言語及びC++では文字列を入力する関数ごとに終端文字や改行コードの扱いが異なる場合があるため、その点で混同しないように気をつけたい。

最後に

今回はコンソールを使った文字列の入力について説明を行った。JavaやC#と比較するとややこしい部分が非常に多く、気をつけなければならない点が多いが、是非とも使いこなしておきたい機能の一つである。

なお、ここではC言語においてポインターを扱った。これはC言語及びC++における鬼門の一つで、これがわからないと非常に苦労する要素の一つである。ポインターについては近いうちに説明を行いたい。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。
  1. callocでは必ず0で初期化されるため、基本的にはその点で注意する必要はない []
  2. また最大文字数をこえて入力した場合、入力ストリームに文字が残るため、必要に応じて除去する必要もある []