• 検索結果がありません。

ポインタ変数

N/A
N/A
Protected

Academic year: 2021

シェア "ポインタ変数"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング及び実習⑦

(2)

文字列処理

• 文字列

文字列は「"」(ダブルクォーテーション)で囲んで表現 される。文字列というデータ型が存在しないので、文字 列は文字の配列、あるいはポインタ変数として扱われ る。また、文字の配列あるいはポインタ変数を宣言する ときのデータ型はcharを用いる。従って、

char s[]="Ryukoku Uni."; あるいは、 char *s="Ryukoku Uni.";

で文字の配列宣言をしておくと、配列sに実際の文字列

(3)

文字列

この配列は計算機上実際に以下のように表現される。

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’が自動的に 付加される。

(4)

文字列

一般的には、他の変数と同様、文字列を宣言するとき、 初期値を与えない場合が多い。 char s[64]; ← 文字配列 数字64は配列の大きさだが、最後に必ずヌル文字‘¥0’を入れ ないといけないので、格納できる半角文字の最大個数は 64-1=63 になる。

(5)

ポインタ変数で宣言の場合

の注意点

①以下は×

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をよく使う。 参考

(6)

文字列の付与方法(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++; }

(7)

文字列を丸ごとに読み込む

#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)

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の高度な使い方では

(9)

scanf()・getchar()・fgets()

の併用について

• scanf()

・

getchar()・fgets()

の併用は要注意。

scanf(), getchar()

は改行記号を読まずに

バッファに残すので、次に

getchar()

や

fgets()

を使うと、まずその改行記号を読み込んで

しまう。

(10)

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が実行されてしまう。

(11)

文字列の付与方法(4/4)

• strcpy(s, “Ryukoku Uni.”);

のような文字列処理の関数を用いる。

(後で紹介する)

注意:

char s[64];

s=“Ryukoku Uni.”;

はだめ!

(12)

文字列の出力方法

puts(s);

// ヌル文字‘¥0’を改行に置き換える

123

を

fgets

で読み込んだ場合、

puts(s)

を実行すれば、

123

が出力される。

一方、

printf(“%s”, s);

は文字列を

余分な改行をせず

出力

する(上記例では、改行は1回するのみ。したがって

空行なし)

当たり前だけど、printf(s);という書き方もある。

空行

(13)

演習問題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);

(14)

例:ファイルの複写プログラム

#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 を使わない (なぜ?)

(15)

例:ファイルの複写プログラム

#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)

16

実行結果

./a.out

Ryukoku University

Ryukoku University

Shiga-ken Otsu-shi

Shiga-ken Otsu-shi

Ctrl-Dで終了

cat

input.dat

This is a test!

That is OK!!

./a.out<

input.dat

>

output.dat

cat

output.dat

This is a test!

That is OK!!

(17)

Question

• fgets()の代わりにgetchar()を使う場合のプ

ログラムは?

(18)

演習問題2

• fgetsを用いて文字列変数s1に文字列を読

み込み、それを文字列変数s2にコピーする

プログラムを作成しなさい。ただし、strcpy()

のような文字列をコピーする標準関数は使

わないとする。

(19)

演習問題3

• fgetsを用いて文字列変数s1に文字列を読

み込み、英文字数字以外の文字を取り除

いて文字列変数s2にコピーし、そのs2を出

力するプログラムを作成しなさい。

• 実行例: ./a.out a1%b2@c3 a1b2c3

(20)

第7回実習課題(1/3)

1.fgetsで文字列を読み込み、文字間に記号+を挿入して出 力するプログラム(ex07-add.c)を作成しなさい。 実行例 $ ./a.out abcdefg ← 入力 a+b+c+d+e+f+g ← 出力 123456 ← 入力 1+2+3+4+5+6 ← 出力 Ctrl-D ← 入力 終了

(21)

第7回実習課題(2/3)

2.fgetsで文字列を読み込み、文字数を求めるとともに文字列 の逆順出力をするプログラム(ex07-rev.c)を作成しなさい。 実行例 $ ./a.out abcdefg ← 入力 gfedcba(7) ← 出力 ytisrevinU ukokuyR ← 入力 Ryukoku University(18) ← 出力 Ctrl-D ← 入力 終了

(22)

第7回実習課題(3/3)

3.2つの変数に2つの文字列をキーボード入力し、それらを 新しい文字列変数に繋げて格納し、新しい文字列の中身 を(1つ1つの文字で出力ではなく)文字列として一括出力 するプログラム(ex07-strcat.c)を作成しなさい。 実行例 $ ./a.out Ryukoku ← 入力 University ← 入力 RyukokuUniversity ← 出力 終了 なお、余裕があれば、プログラムをCtrl-Dが押されるま で繰り返し処理できるように改良してみること。

参照

関連したドキュメント

噸狂歌の本質に基く視点としては小それが短歌形式をとる韻文であることが第一であるP三十一文字(原則として音節と対応する)を基本としへ内部が五七・五七七という文字(音節)数を持つ定形詩である。そ

特に、その応用として、 Donaldson不変量とSeiberg-Witten不変量が等しいというWittenの予想を代数

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

目標を、子どもと教師のオリエンテーションでいくつかの文節に分け」、学習課題としている。例

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を