オブジェクト指向言語
オブジェクト指向言語演習
第17回 プログラミング応用
- コマンドラインからの文字列の取得 -
スケジュール(C言語)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
受講ガイダンスとプログラム開発基礎
Linuxの使い方と簡単なC言語プログラムの作成,実行
C言語 変数と式
(2004/10/04)
C言語 制御と流れ
(2004/10/04)
C言語 変数と式(復習)
(2004/10/18)
C言語 制御と流れ(復習)
(2004/10/18)
C言語 関数
(2004/10/25)
C言語 配列
(2004/10/25)
C言語 第1回到達度チェック試験
(2004/11/01)
C言語 文字列
(2004/11/01)
C言語 第1回到達度確認試験説明
(2004/11/15)
C言語 配列と文字列の復習
(2004/11/15)
C言語 ポインタ
(2004/11/22)
C言語 構造体とユーザ定義型
(2004/11/22)
C言語 ファイル入出力
(2004/11/29)
C言語 プログラミング応用
(2004/11/29)
C言語 プログラミング応用
(2004/12/06)
C言語 ポインタと配列・関数
(2004/12/06)
中間試験
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
2
コマンドラインから引数文字列を取得する(1)
 コマンドラインから文字列を取得するにはmain関数
の引数を利用する。
oot17-1.c
#include <stdio.h>
int main (int argc, char *argv[]){
int i;
printf(“The number of arguments is %d.\n”,argc);
for( i=0 ; i < argc; i++){
printf("No. %d %s¥n", i, argv[i]);
}
}
 整数変数argcにコマンドラインの引数の数が入る。
 argv[0]にはコマンド名(a.out等)のポインタが入る。
argv[1]には1番目の引数……の順番で入る。
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
3
コマンドラインから引数文字列を取得する(2)
int main (int argc, char *argv[]){
}
 argv[]は引数の文字列へのポインタが
入っている配列
Addr0
実行結果
% oot17-1 abc def geh
The number of arguments is 4.
No. 0 oot17-1
実行ファイル名
No. 1 abc
No. 2 def
No. 3 geh
%
29.Nov.2004
o
Addr1
ポインタ
配列
文字列の
アドレス
argv[0] Addr0
argv[1] Addr1
argv[2] Addr2
argv[3] Addr3
a
Addr3
g
o
b
e
t
c
h
1
\0
\0
7
Addr2
d
-
e
1
f
\0
\0
Object Oriented Language - Y.Nagasaka: [email protected]
argc
4
4
コマンドラインから引数文字列を取得する(3)
 コマンドラインの2つ目の文字列の名前のファイルを読み込み
モードで開き、処理する例題
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]){
引数が少ない時のエラー処理
FILE *fp;
if (argc <= 1) printf(“Error in arguments\n”);
if ((fp = fopen(argv[1],”r”)) == NULL) {
printf(“Error: open file %s\n”,argv[1];
exit (EXIT_FAILURE);
}
ファイルが存在しない等の
エラーが生じたときの処理
ファイルの処理
fclose(fp);
}
 2つ目の文字列の入っている場所を指し示すポインタは
argv[1]に入っている。
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
5
文字列の復習
配列に文字を格納する
 文字列の終端を表す文字”\0”はNULL文字とも呼ば
れ、ASCIIコードで0である。
文字列宣言時に代入し、printf関数を使ってその文字列を打ち出す
#include <stdio.h>
int main(void){
char str[6]=“HELLO”;
char str[]=“HELLO”;
printf(“%s\n”,str);
return 0;
printf(“%s\n”,str);
%sは文字列を打ち出すためのformat書式
}
str
29.Nov.2004
0
1
2
3
4
5
H
E
L
L
O
\0
Object Oriented Language - Y.Nagasaka: [email protected]
7
文字列の操作 文字列の中を調べる(1)
 キーボードから入力された1行の中に含まれる’a’の
文字数を数えるプログラム
#include <stdio.h>
#define MAXLINE 1024
int main( void ) {
1023文字(最後に\0が入るため)までを格納
char line[MAXLINE];
できるlineという名前の文字配列を定義する
int i, cnt=0;
printf("Input a line >>>");
gets( line );
gets関数を呼び、文字列lineに入れる
for ( i = 0 ;line[i] != '\0'; i++){
if(line[i] == 'a') cnt++;
line[i]が\0になるまで順番に調
}
べ、’a’であればcntを1つ増や
す
printf("The number of 'a' is %d.\n",cnt);
return 0;
}
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
8
文字列の操作 文字列の中を調べる(2)
 前述のプログラムをポインタを使って書き直してみ
よう。
#include <stdio.h>
#define MAXLINE 1024
int main( void ) {
char line[MAXLINE], *lp;
int i, cnt=0;
lp = line;
printf("Input
gets( line );
lpという文字型のポインタを宣言する
line[0]のアドレスをlpに代入する
lp = &line[0];
でも同じ
a line >>>");
*lpが\0になるまで順番に調
for ( ;*lp++ != '\0‘; lp++){
べ、’a’であればcntを1つ増や
if(*lp == 'a') cnt++;
す
}
printf("The number of 'a' is %d.\n",cnt);
return 0;
}
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
9
文字列の操作 文字列の中を調べる(3)
 前述のプログラムを関数で実現する。与えられた文字列に対し
て指定の文字の個数を返すstr_count_a関数を作成する。
#include <stdio.h>
#define MAXLINE 1024
int str_count_a(char *, char);
int main( void ) {
char line[MAXLINE];
int i, cnt=0;
printf("Input a line >>>");
gets( line );
cnt = str_count_a(line, 'a');
printf("The number of 'a'
is %d.\n",cnt);
return 0;
int str_count_a(char *str, char c){
int cnt = 0;
while (*str != '\0'){
if(*str == c) cnt++;
str++;
}
return cnt;
}
str_count_aは個数(整数)を返すので、
int型の関数となる。
}
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
10
文字列の操作 文字列の中を調べる(4)
 入力された文字列にコマンドラインの1つ目で指定された文字
が含まれるのかを調べるプログラム
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024
int str_count_a(char *, char);
int main(int argc, char *argv[]){
char line[MAXLINE], ch;
int i, cnt=0;
if (argc <= 1) {
printf("Error in
arguments\n");
exit (EXIT_FAILURE);
}
ch = *argv[1];
printf("Input a line >>>");
gets( line );
29.Nov.2004
cnt = str_count_a(line, ch);
printf("The number of '%c'
is %d.\n", ch, cnt);
return 0;
}
int str_count_a ....前述のものを利用
argc[1]は1つ目の引数の文字列に対す
るポインタを表す。
*argc[1]は1つ目の引数の文字列の1
番目の文字を表す。
もし、1つめの引数の2番目の文字が必
要ならば、*(argc[1]+1)となる。
Object Oriented Language - Y.Nagasaka: [email protected]
11
文字列の操作 文字列の中を調べる(5)
 前述のプログラムで1つ目の引数が数える文字、2つ目の引数がファ
イル名とし、ファイルの中に含まれる文字を数えるプログラム
#include <stdlib.h>
#define MAXLINE 1024
int str_count_a(char *, char);
int main(int argc, char *argv[]){
char line[MAXLINE], ch;
int i, cnt=0;
FILE *fp;
if (argc <= 2) {
printf("Error in
arguments\n");
exit (EXIT_FAILURE);
}
if((fp=fopen(argv[2],“r”))
== NULL) {
printf("Error: open
file %s\n",argv[1]);
exit (EXIT_FAILURE);
}
29.Nov.2004
ch = *argv[1];
while(fgets(line,MAXLINE, fp)){
cnt += str_count_a(line, ch);
}
printf("The number of '%c' in
file %s is %d.\n",
ch, argv[2], cnt);
return 0;
}
開くファイルのファイル名が入ってい
るポインタはargv[2]である。
Object Oriented Language - Y.Nagasaka: [email protected]
12
課題1
 ファイルに含まれる数字(‘0’-’9’)の数を数えるプ
ログラムを作成しなさい(oo17-1.c)。ただし、コ
マンドラインの引数にファイル名を与えるものとし
なさい。
 ヒント
 1行に含まれる数字を数える関数str_cnt_nを作成する。
 あとは今回の例題とほとんど同じ。
29.Nov.2004
Object Oriented Language - Y.Nagasaka: [email protected]
13
コンパイルと実行
 まずはじめに
一度実行すればよい
 作業ディレクトリの作成
% mkdir ~/wrk/
% mkdir ~/wrk/oo/
 次に




作業ディレクトリへの移動
プログラミング
コンパイル・リンク
実行
% cd ~/wrk/oo
% vi lect01-1.c
% gcc -o lect01-1 lect01-1.c
% ./lect01-1
* C言語プログラムのファイル名は、.c でなければならない
注
意
29.Nov.2004
* プログラムが終了しなくなったら
Ctrl キーを押しながら c
を押して強制終了すること
Object Oriented Language - Y.Nagasaka: [email protected]
14
ダウンロード

Document