プログラミング及び実習⑤
文字処理
単一の文字は「
‘
」と「
’
」(シングルクォーテー
ション)で囲んで表現される。文字のデータ型は
charまたはintである。intを用いたほうが、ライブ
ラリの関数の引数の型と一致する。
以下は全部intの使用に統一する。従って、
int ch;
で文字変数を宣言しておくと、
ch=‘A’;
のように、chに文字Aを付与する
ことができる(
int ch=‘A’;で宣言するの
もOK)。
!注意:ch=A;はだめ!
数値処理:
文字の入出力
キーボードからの入力は
ch=getchar(); or
scanf(“
%c
”, &ch);
/* intで宣言の場合、warningmessageが出る処理系がある。 charで宣言すると、
warning messageが出ない */
ディスプレイへの出力
空白文字
単一の文字として「空白文字」が色々なところに
使われる。
空白文字は以下のように与える
ch=‘ ’;
出力は前に述べた方法でchを出力することは
できるが、
putchar(‘ ’);
でも出力できる。もちろん、
printf(“ ”);
でもOK。
空白はよく判断文にも使われる:if(ch == ‘ ’) ....
制御文字とは
• 上に述べた普通の文字以外に、制御文字
と呼ばれるものがある。制御文字とは、出
力のコントロールやそのままでは表現でき
ない文字を扱うために用いられる。
主な制御文字
制御文字 使用例 機能 ¥n printf(“¥n”); 改行し、次の行の先頭にいく ¥t printf(“¥t”); 水平タブ ¥b printf(“¥b”); 一文字分戻る ¥r printf(“¥r”); 同じ行の先頭に戻る ¥f printf(“¥f”); 改ページ、またはスクリーンクリア ¥¥ printf(“¥¥”); ¥を出力する 注意:printf(“¥”)ではだめ! ¥‘ printf(“¥‘”); ‘を出力する 注意:printf(“‘”)ではだめ! ¥“ printf(“¥“”); “を出力する 注意:printf(““”)ではだめ! linuxではバックスラッシュ制御文字についての補足
制御文字は表面上2つの文字で表されているが、
計算機内部では
単一の文字
(つまり同じバイト数)
で表現されている。従って、普通文字と同様、
int ch;
ch=‘¥t’;
はOKである。以上のように制御文字を
ch
に付与す
ると、以下の2文は等価になる:
printf(“制御文字
¥t
使用例
¥t
機能¥n”);
printf(“制御文字
%c
使用例
%c
機能¥n”, ch, ch);
1文字分コンピュータ内部では、全ての文字は整数(文
字コード)で表現されている。
(半角英数字や記
号)
文字は
アスキーコード
表と呼ばれるものに
従っている。たとえば英数字は以下の通りに対
応している。
‘A’, ‘B’, ..., ‘Z’
65-90
‘a’, ‘b’, .... ‘z’
97-122
‘0’, ... ‘9’
48-57
英数字文字と整数値の対応
文字 整数値 数字文字 英字文字Question
(1)putchar(‘A’); ?
(2)putchar(65); ?
(3)int ch=‘A’; printf(“%c %d¥n”, ch, ch); ? (4)printf(“%c %d¥n”, ‘A’, ‘A’); ?
(5)printf(“%c %d¥n”, 65, 65); ? (6)putchar(65+3); ? (7)putchar(68); ? (8)putchar(‘A’+3); ? (9)ch=‘D’; putchar(ch-‘A’+‘a’); ? (10)putchar(‘D’-‘A’+‘a’-2); ?
演習問題1
三つの文字変数を用いて
任意
の3文字
をキーボードから入力し、それらに
+
記号を
挿入して出力するプログラムを書きなさい。
実行例:
$ ./a.out
abc
入力
+a+b+c
出力
プログラムの改良
前のプログラムの問題点の1つは、文字の数だ
け、文字変数を用意しなければならない。した
がって、文字の数が多い場合は対処困難である。
たとえば、以下の例では、10個の文字変数を用
意しなければならない。
実行例:
$ ./a.out
abcdefghij
入力
#include <stdio.h> main() { int ch; while((ch=getchar()) != '¥n') printf("+%c", ch); putchar('¥n'); }
プログラムの改良
プログラムのさらなる改良
前のプログラムでは、一行が入力されると、プログラム が終了してしまう。特殊なキーを押すまで、繰り返し入力 ができるようにしたい。 実行例 $ ./a.out abc 入力 +a+b+c 出力 opqxyz 入力 +o+p+q+x+y+z 出力 Ctrl-D 入力#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF){ if(ch != '¥n') printf("+%c", ch); else printf("¥n"); } }
プログラムのさらなる改良
プログラム①#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF) printf("+%c", ch); }
プログラム①とプログラム②は
何が違う?
プログラム②②の実行結果は以下になる
実行例
$ ./a.out
abc
入力
+a+b+c
+
出力
opqxyz
入力
+o+p+q+x+y+z
+
出力
Ctrl-D
入力
終了
最後に+が出力される演習問題2
前のプログラム①を各入力文字を3文字ずらす(例:a →d)ように修正しなさい。ただし、文字はa~wの範囲内の ものとする(つまり、x,y,zは除外する)。 実行例 $ ./a.out abc 入力 +d+e+f 出力 defghi 入力 +g+h+i+j+k+l 出力 Ctrl-D 入力ファイルの複写プログラム
#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF) printf(“%c”, ch); // putchar(ch); }ファイルの複写プログラム
This is a test file. Ryukoku University Program Lecture s.dat
./a.out<s.dat>o.dat
This is a test file. o.dat
例題(1/2)
文字をキーボードから入力し、改行を入れた時点で
小文字を大文字
大文字・数字・改行記号はこのまま
特殊文字(英数字・改行以外の文字)を空白
に変換して出力するプログラム。ただし、 Ctrl+Dで終了
とする。
例題(2/2)
#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF){ if(ch>=‘a’ && ch<= ‘z’) // 小文字なら putchar(ch-‘a’+’A’); // 大文字にelse if(ch>=‘A’ && ch<=’Z’ || ch>=‘0’ && ch<=’9’ || ch==’¥n’)
putchar(ch); // 大文字か数字か改行はそのまま