プログラミング及び実習⑦
文字列処理
• 文字列
文字列は「"」(ダブルクォーテーション)で囲んで表現 される。文字列というデータ型が存在しないので、文字 列は文字の配列、あるいはポインタ変数として扱われ る。また、文字の配列あるいはポインタ変数を宣言する ときのデータ型はcharを用いる。従って、char s[]="Ryukoku Uni."; あるいは、 char *s="Ryukoku Uni.";
で文字の配列宣言をしておくと、配列sに実際の文字列
文字列
この配列は計算機上実際に以下のように表現される。
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] s[10] s[11] s[12] R y u k o k u U n i . ¥0 つまり、文字列を上記のように宣言し、実際の値を付与すると、 1文字ごとに配列に格納され最後にヌル文字‘¥0’が自動的に 付加される。文字列
一般的には、他の変数と同様、文字列を宣言するとき、 初期値を与えない場合が多い。 char s[64]; ← 文字配列 数字64は配列の大きさだが、最後に必ずヌル文字‘¥0’を入れ ないといけないので、格納できる半角文字の最大個数は 64-1=63 になる。ポインタ変数で宣言の場合
の注意点
①以下は×
char *s1=“Ryukoku”, s2[]=“ Uni.”; strcat(s1, s2);
②以下は○
char s1[64]=“Ryukoku”, s2[]=“ Uni.”; // *s2=“ Uni.”;も OK strcat(s1, s2); ③メイン関数でchar *s;で宣言するなら、malloc関数でメモリを確保 して使う。あるいは、他の文字列変数を指し示すのに使う(例え ば、char *s1, s2[64]; s1=s2;) これらの場合、連結などの文字列操作はOK ④関数側の引数としてはchar *sをよく使う。 参考
文字列の付与方法(1/4)
• 文字ごとに付与
s[0]=‘R’;
or
getchar()
を用いる
s[1]=‘y’;
⋮
s[7]=‘ ’;
s[12]=‘¥0’;
i=0; while((s[i]=getchar()) != EOF){ if(s[i]==‘¥n’){ s[i]=‘¥0’; i=0;} //reset else i++; }文字列を丸ごとに読み込む
#define N 5 char line[N];
fgets(line, sizeof(line), stdin);
改行までか最大N-1個の文字を読み込むことができる。
123
を入力した場合、
line[0]=‘1’, line[1]=‘2’, line[2]=‘3’, line[3]=‘¥n’, line[4]=‘¥0’
123456
を入力した場合、
line[0]=‘1’, line[1]= ‘2’, line[2]=‘3’, line[3]=‘4’, line[4]=‘¥0’ になる
できれば大きめの数字 (256など)
8
文字列の付与方法(3/4)
char s[64];
scanf(“%s”, s);
で文字列を読み込むこともできる。ただし、
たとえば、
ab cd
という一行を入力する場合、
fgets(s, sizeof(s), stdin)
なら、sに
ab cd¥n
がそのまま入る。つまり、
空白や改行記号まで読み込む
。
scanf(“%s”, s)
なら、sに
ab
のみが入る。すなわち、
s[0]=‘a’, s[1]=‘b’, s[2]=‘¥0’
scanfの高度な使い方ではscanf()・getchar()・fgets()
の併用について
• scanf()
・
getchar()・fgets()
の併用は要注意。
scanf(), getchar()
は改行記号を読まずに
バッファに残すので、次に
getchar()
や
fgets()
を使うと、まずその改行記号を読み込んで
しまう。
scanf()・getchar()・fgets()
の併用について
#include <stdio.h>
int main(void)
{
char s[64];
int ch;
ch=getchar();
getchar();
fgets(s, 64, stdin);
puts(s);
return 0;
}
これがなければ、fgetsは¥nを 読み込んで終わり。つまり、 fgetsで文字列の入力を待た ずにputsが実行されてしまう。文字列の付与方法(4/4)
• strcpy(s, “Ryukoku Uni.”);
のような文字列処理の関数を用いる。
(後で紹介する)
注意:
char s[64];
s=“Ryukoku Uni.”;
はだめ!
文字列の出力方法
puts(s);
// ヌル文字‘¥0’を改行に置き換える
123
を
fgets
で読み込んだ場合、
puts(s)
を実行すれば、
123
が出力される。
一方、
printf(“%s”, s);
は文字列を
余分な改行をせず
出力
する(上記例では、改行は1回するのみ。したがって
空行なし)
当たり前だけど、printf(s);という書き方もある。
空行演習問題1
下記のプログラムの出力を、改行や空白の 有無も含め、示しなさい。 #include <stdio.h> int main(void) { char line[128];fgets(line, sizeof(line), stdin); // “Ryukoku Univ.”を入力
puts(line);
scanf(“%s”, line); // “Ryukoku Univ.”を入力
printf(“%s”, line); puts(line);
例:ファイルの複写プログラム
#include <stdio.h>
#define N 16
Nを大きく設定する必要は?
int main(void)
{
char line[N];
while(fgets(line, sizeof(line), stdin) !=
NULL
)
printf(“%s”, line);
return 0;
}
EOFまたはエラー puts を使わない (なぜ?)例:ファイルの複写プログラム
#include <stdio.h>
#define N 16
int main(void)
{
char line[N];
int i;
while(fgets(line, sizeof(line), stdin) != NULL){
for(i=0;
line[i] != '¥0'
; i++)
putchar(line[i]);}
return 0;
}
16