Download : sample-001.c
/* * 2017/11/17 sample-001.c */ /* * 文字列の入力\n *\tscanf の「%s」で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-001.c * リンク * cc -o sample-001.exe sample-001.c * 実行 * ./sample-001.exe */ #include <stdio.h> /* * main 関数 */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); scanf ( "%s", line ); /* 書式は「%s」で、文字型配列名を直接使う(&)は不要 */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* 空白文字(空白/タブ/改行)があると、「文字列の区切」とみなされる */ return 0; }
空白(' ')を含んだ、適当な長さの文字列
$ ./sample-001.exe < sample-001.in キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白(' あなたが入力した文字列は「空白('」です。 $
Download : sample-002.c
/* * 2017/11/17 sample-002.c */ /* * 文字列の入力 (2)\n *\tgets で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-002.c * リンク * cc -o sample-002.exe sample-002.c * 実行 * ./sample-002.exe */ #include <stdio.h> /* * main 関数 */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); gets ( line ); /* gets では、「一行(改行の直前迄:改行含まず)」の文字列が入力される */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* gets は一行(改行)までを入力する */ return 0; }
空白(' ')を含んだ、適当な長さの文字列
$ ./sample-002.exe < sample-002.in キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白(' ')を含んだ、適当な長さの文字列 あなたが入力した文字列は「空白(' ')を含んだ、適当な長さの文字列」です。 $
Download : sample-003.c
/* * 2017/11/17 sample-003.c */ /* * 文字列の入力 (3)\n *\tfgets で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-003.c * リンク * cc -o sample-003.exe sample-003.c * 実行 * ./sample-003.exe */ #include <stdio.h> /* * main 関数 */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); fgets ( line, LINE_SIZE, stdin ); /* 入力先は、「標準入力 (stdin)」となる */ /* fgets では、文字列サイズが指定できる (安全) */ /* 指定したサイズより長い文字列は、入力が「待たされ」る */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* 入力文字列内には、「改行」も含まれる */ return 0; }
空白(' ')を含んだ、適当な長さの文字列
$ ./sample-003.exe < sample-003.in キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白(' ')を含んだ、適当な長さの文字列 あなたが入力した文字列は「空白(' ')を含んだ、適当な長さの文字列 」です。 $
Download : sample-011.c
/* * 2017/11/17 sample-011.c */ /* * sizeof 演算子\n *\t型名を指定する事により、そのサイズ(byte 単位)を得る事ができる * * 利用方法 * コンパイル * cc -c sample-011.c * リンク * cc -o sample-011.exe sample-011.c * 実行 * ./sample-011.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { printf ( "sizeof ( char ) = %d\n", sizeof ( char ) ); printf ( "sizeof ( int ) = %d\n", sizeof ( int ) ); printf ( "sizeof ( double ) = %d\n", sizeof ( double ) ); return 0; }
$ ./sample-011.exe sizeof ( char ) = 1 sizeof ( int ) = 4 sizeof ( double ) = 8 $
Download : sample-012.c
/* * 2017/11/17 sample-012.c */ /* * sizeof 演算子 (2)\n *\t変数名を指定する事により、そのサイズ(byte 単位)を得る事ができる * * 利用方法 * コンパイル * cc -c sample-012.c * リンク * cc -o sample-012.exe sample-012.c * 実行 * ./sample-012.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { char cvar; int ivar; double dvar; printf ( "sizeof ( cvar ) = %d\n", sizeof ( cvar ) ); printf ( "sizeof ( ivar ) = %d\n", sizeof ( ivar ) ); printf ( "sizeof ( dvar ) = %d\n", sizeof ( dvar ) ); return 0; }
$ ./sample-012.exe sizeof ( cvar ) = 1 sizeof ( ivar ) = 4 sizeof ( dvar ) = 8 $
Download : sample-013.c
/* * 2017/11/17 sample-013.c */ /* * sizeof 演算子 (3)\n *\t配列名を指定する事により、そのサイズ(byte 単位)を得る事ができる * * 利用方法 * コンパイル * cc -c sample-013.c * リンク * cc -o sample-013.exe sample-013.c * 実行 * ./sample-013.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { char cary[100]; int iary[100]; double dary[100]; printf ( "sizeof ( cary ) = %d\n", sizeof ( cary ) ); printf ( "sizeof ( iary ) = %d\n", sizeof ( iary ) ); printf ( "sizeof ( dary ) = %d\n", sizeof ( dary ) ); return 0; }
$ ./sample-013.exe sizeof ( cary ) = 100 sizeof ( iary ) = 400 sizeof ( dary ) = 800 $
Download : sample-014.c
/* * 2017/11/17 sample-014.c */ /* * sizeof 演算子 (4)\n *\t値を指定する事もできる * * 利用方法 * コンパイル * cc -c sample-014.c * リンク * cc -o sample-014.exe sample-014.c * 実行 * ./sample-014.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { printf ( "sizeof ( 'a' ) = %d\n", sizeof ( 'a' ) ); /* sizeof ( int ) [整数] になっている */ printf ( "sizeof ( 123 ) = %d\n", sizeof ( 123 ) ); printf ( "sizeof ( 12.3 ) = %d\n", sizeof ( 12.3 ) ); return 0; }
$ ./sample-014.exe sizeof ( 'a' ) = 4 sizeof ( 123 ) = 4 sizeof ( 12.3 ) = 8 $
Download : sample-015.c
/* * 2017/11/17 sample-015.c */ /* * sizeof 演算子 (5)\n *\t式のサイズも得られる\n *\tchar 型のデータは、計算の時に、int 型に昇格する * * 利用方法 * コンパイル * cc -c sample-015.c * リンク * cc -o sample-015.exe sample-015.c * 実行 * ./sample-015.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { char ch; char dh; printf ( "sizeof ( ch ) = %d\n", sizeof ( ch ) ); /* sizeof ( char ) [文字] になっている */ printf ( "sizeof ( ch + dh ) = %d\n", sizeof ( ch + dh ) ); /* sizeof ( int ) [整数] になっている */ /* 無条件の型の昇格がおきている */ return 0; }
$ ./sample-015.exe sizeof ( ch ) = 1 sizeof ( ch + dh ) = 4 $
Download : sample-016.c
/* * 2017/11/17 sample-016.c */ /* * 型の昇格\n *\tint 型から double 型への変換 * * 利用方法 * コンパイル * cc -c sample-016.c * リンク * cc -o sample-016.exe sample-016.c * 実行 * ./sample-016.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { int num; int mum; printf ( "sizeof ( num ) = %d\n", sizeof ( num ) ); printf ( "sizeof ( num + 'A' ) = %d\n", sizeof ( num + 'A' ) ); printf ( "sizeof ( num + mum ) = %d\n", sizeof ( num + mum ) ); printf ( "sizeof ( num + 1.0 ) = %d\n", sizeof ( num + 1.0 ) ); return 0; }
$ ./sample-016.exe sizeof ( num ) = 4 sizeof ( num + 'A' ) = 4 sizeof ( num + mum ) = 4 sizeof ( num + 1.0 ) = 8 $
Download : sample-017.c
/* * 2017/11/17 sample-017.c */ /* * 型の変換\n *\t代入では、必要に応じて型変換が行わる * * 利用方法 * コンパイル * cc -c sample-017.c * リンク * cc -o sample-017.exe sample-017.c * 実行 * ./sample-017.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { char ch = 'A'; /* そもそも 'A' は int 型 */ int num = 'A'; double fp = 'A'; /* int 型から double 型へ */ ch = ch - 'A' + 'a'; /* int 型から char 型へ */ ch = num; /* int 型から char 型へ */ num = fp; /* double 型から int 型へ */ printf ( "ch = %c\n", ch ); printf ( "num = %d\n", num ); printf ( "fp = %f\n", fp ); return 0; }
$ ./sample-017.exe ch = A num = 65 fp = 65.000000 $
Download : sample-018.c
/* * 2017/11/17 sample-018.c */ /* * 型の変換 (2)\n *\tサイズの大きい方から、小さい方への変換は危険 * * 利用方法 * コンパイル * cc -c sample-018.c * リンク * cc -o sample-018.exe sample-018.c * 実行 * ./sample-018.exe */ #include <stdio.h> /* * main 関数 */ int main ( int argc, char *argv[] ) { char ch = 'A'; int num = 'A'; double fp = 'A'; /* 個々に適切な値を入れれば問題はない */ printf ( "[適切な値]\n" ); printf ( "\tch = '%c' [%d]\n", ch, ch ); printf ( "\tnum = %d\n", num ); printf ( "\tfp = %f\n", fp ); /* char 型に収まらないサイズの値を代入すると ?? */ num = 1000; /* 1000 > 255 なので、1000 は char 型に収まらない */ ch = num; /* 代入を行うとどうなるか */ printf ( "[char に大きな値]\n" ); printf ( "\tch = '%c' [%d]\n", ch, ch ); printf ( "\tnum = %d\n", num ); /* int 型に収まらないサイズの値を代入すると ?? */ fp = 1000000000000; num = fp; ch = fp; printf ( "[int に大きな値]\n" ); printf ( "\tch = '%c' [%d]\n", ch, ch ); printf ( "\tnum = %d\n", num ); printf ( "\tfp = %f\n", fp ); return 0; }
$ ./sample-018.exe [適切な値] ch = 'A' [65] num = 65 fp = 65.000000 [char に大きな値] ch = '?' [-24] num = 1000 [int に大きな値] ch = ' ' [0] num = -2147483648 fp = 1000000000000.000000 $
/* * 課題 20171110-02 * * 20171110 20171110-02-QQQQ.c * * 文字列の途中に文字を挿入する * * 利用方法 * コンパイル * cc -o BASENAME.exe 20171110-02-QQQQ.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * */ /* * main * */ #define CSIZE 10 #define EOS '\0' int main( int argc, char *argv[] ) { char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS }; /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | */ int i; /* 文字配列の添え字 */ int l; /* 文字列の長さを保存する変数 */ printf ( "最初の cary = %s\n", cary ); /* 文字列 "abcde" の入った文字配列 cary の 3 文字目 ('c') と 4 文字目 ('d') の間に、一文字 'X' を入れる */ /* 事前: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | 事後: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | -> 前 cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | | +---+ 一か所ずれた場所に移動 | cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | */ /* 文字列の長さを求める */ for ( l = 0; cary[l] != EOS; l++ ) { } /* この for 構文は、cary[l] が最初に EOS になると終わる。 この時、l には、文字列の長さが入る -> トリッキーだが、C プログラマの常識の一つ この「文字列の長さを求める」という行為はよく行われるので、 実は、標準ライブラリの中に、strlen という関数があり、 l = strlen ( cary ); と書くのが、本当の常識。 */ /* cary の中の文字列の長さは、変数 l に入る */ for ( i = l; 3 <= i; i-- ) { /* 後ろからコピーする必要がある */ cary[i+1] = cary[i]; /* 一つ後ろの場所に、今の場所の文字を入れる */ } /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'d'|'e'|EOS| ? | ? | ? | ? | */ cary[3] = 'X'; /* 空けた場所に 'X' を入れる */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | | | | \ \ \ cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | ? | */ printf ( "'X' を挿入した結果 : %s\n", cary ); return 0; } /* C 言語で、「文字列の操作」を考えるときには、 文字列と同じ内容の文字配列をつくって、 その文字配列を色々と操作する C 言語では、配列操作という基本機能を使って、 文字列を操作できる 文字列操作が自由にできる */
/* * 20171117-01-QQQQ.c * 一行分の文字列を入力して、その中の文字列を全て大文字に変換する */ #include <stdio.h> /* * islower (ch) : 指定された文字が、小文字かどうかを判定する */ int islower ( int ch ) { return 'a' <= ch && ch <= 'z'; /* 'a' 〜 'z' なら小文字 */ /* 「条件式」は、「整数値」を持つ */ /* 偽 <-> 0, 真 <-> 0 以外 */ } /* * toupper ( ch ) : 指定された文字が、小文字なら大文字に変換 */ int toupper ( int ch ) { if ( islower ( ch ) ) { /* 小文字だった.. */ /* ** この部分を完成させなさい ** 以前やったので復習をかねて、考えてほしい ** ch の値が 'a' の時は 'A' を ch - 'a' + 'A' 'b' の時には、 'B' を ch - 'b' + 'B' = ch - 'a' + 'A' と同じ ch - ('a'+1) + ('A'+1) .. 'z' の時には、 'Z' を返したい 'a' -> 'A' return ch - 'a' ... */ } else { /* そうでないなら */ return ch; /* そのまま返す */ } } /* * main */ #define EOS '\0' /* EOS を定義 */ #define LINE_SIZE 128 /* 入力するのに十分に大きなサイズにする */ int main ( void ) { char line[LINE_SIZE]; int i; printf ( "小文字を含んだ文字列を入力してください : " ); /* 文字列の入力する sample-003.c の方法を使う !!! 注意・注意・注意 sample-002.c や sample-001.c の方法は 「使ってはいけない」 */ fgets( line, LINE_SIZE, stdin ); for ( i = 0; line[i] != EOS; i++ ) { /* 文字列処理のイデオム */ line[i] = toupper ( line[i] ); /* 小文字を大文字に変換 */ } printf ( "結果 : %s", line ); return 0; }
#include <stdio.h> /* 配列以前 もし、二つの変数 v1, v2 に値をいれるときに、 条件によって、この変数のどちらに値をいれるか 異なる場合はどうなるか ? 例: 入力した値が、奇数だったら、v1 に 偶数だったら v2 に入力する */ int main(int argc, char *argv[]) { int input; /* 入力する値 */ int v1 = -1; /* 奇数の時に値をいれる */ int v2 = -1; /* 偶数の時に値を入れる */ printf ( "正の整数を入力してください : " ); scanf ( "%d", &input ); /* 単純変数しか利用しない場合は、代入文の左辺は 一つの文で、同じものしか、変更できない */ /* if 構文を利用して、代入文そのものを選択する */ if ( input % 2 == 0 ) { /* 偶数なので.. */ v2 = input; /* v2 に値をいれる */ } else { /* 奇数なので .. */ v1 = input; /* v1 に値をいれる */ } printf ( "input = %d, v1 = %d, v2 = %d\n", input, v1, v2 ); return 0; }
#include <stdio.h> /* 配列を利用する もし、一つの配列 v の二つの要素 v[0], v[1] に値をいれるときに、 条件によって、この要素のどちらに値をいれるか 異なる場合はどうなるか ? 例: 入力した値が、奇数だったら、v[0] に 偶数だったら v[1] に入力する */ int main(int argc, char *argv[]) { int input; /* 入力する値 */ int v[2] = { -1. -1 }; /* 配列の初期化 */ printf ( "正の整数を入力してください : " ); scanf ( "%d", &input ); v[1-(input % 2)] = input; /* input は、整数なので、偶数か奇数 input % 2 -> input を 2 で割った余り 偶数 -> input %2 == 0 奇数 -> input %2 == 1 「1-(input % 2)」 偶数 -> 1-(input % 2) == 1 - 0 == 1 奇数 -> 1-(input % 2) == 1 - 1 == 0 「v[1-(input % 2)] = input」 偶数 -> v[1] = input; 奇数 -> v[0] = input; [注意] このような「トリッキー(一目見ただけでは、わからないが、 よーく考えると、なんとかわかるような表現)」は、やめた方がよい。 -> プログラムが短くなり、実行速度も速く より高度なアルゴリズムを作るときには、 このような「簡潔な(短い)」表現が要求される事が多い */ printf ( "input = %d, v[0] = %d, v[1] = %d\n", input, v[0], v[1] ); return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 /* 配列のサイズにあらかじめ名前をつけておく */ int main(int argc, char *argv[] ) { int array[ARRAY_SIZE]; int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { array[i] = i * i; } printf ( "array[%d]=%d\n", 3, array[3] ); /* 9 のはず */ printf ( "*(array+%d)=%d\n", 3, *(array+3) ); /* 同じく 9 のはず */ printf ( "*array = %d\n", *array ); /* 0 になる */ return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 /* 配列のサイズにあらかじめ名前をつけておく */ int main(int argc, char *argv[] ) { int array[ARRAY_SIZE]; int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { array[i] = i * i; } printf ( "array[%d]=%d\n", 3, 3[array] ); /* 9 のはず */ printf ( "*(array+%d)=%d\n", 3, *(array+3) ); /* 同じく 9 のはず */ printf ( "*array = %d\n", *array ); /* 0 になる */ printf ( "%c\n", "abcdefg"[3] ); /* 'd' */ printf ( "%c\n", 3["abcdefg"] ); /* 'd' */ return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 /* 配列のサイズにあらかじめ名前をつけておく */ /* * print_array ( int ary[], int size ) * 引数で指定された、配列の中身を出力する */ void print_array ( int *ary, int size ) { /* 配列の(最初の次元の)サイズは省略可能[指定しても無視される] */ /* 配列サイズは、これとは別に引数で指定する : size */ /* int ary[] は、 int *ary; とかいてもよくて、文字列とよくにている */ int i; for ( i = 0; i < size; i++ ) { printf ( "ary[%d] = %d\n", i, ary[i] ); } } /* * 引数で指定された、配列の中身をすべて 1 倍にする */ void double_array ( int ary[], int size ) { /* * 実引数には、「配列名」を指定する * 「配列名」は「値」を持つので、その「値」がコピーされる * cf. C 言語では、引数の値はコピーされる * その引数の値は、関数内で変更しても、呼び出し側には * 影響を与えない */ int i; for ( i = 0; i < size; i++ ) { ary[i] = ary[i] * 2; /* ary[i] <-> *(ary + i) <-> *(array + i) 何故なら ary には array の値がコピーされているから <-> array[i] main 関数の array[i] を変更する事になる */ } } int main(int argc, char *argv[] ) { int array[ARRAY_SIZE]; int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { array[i] = i * i; } printf ( "呼び出し前:\n" ); print_array ( array, ARRAY_SIZE ); double_array ( array, ARRAY_SIZE ); /* array そののものの値が変化するわけではない その要素となる array[i] ( i = 0 ? 9 ) の値が変化 */ printf ( "呼び出し後:\n" ); print_array ( array, ARRAY_SIZE ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { /* C 言語における、文字列の振る舞い */ printf ( "\"abc\" = %s\n", "abc" ); printf ( "*\"abc\" = %c\n", *"abc" ); printf ( "\"abc\" + 1 = %s\n", "abc" + 1 ); printf ( "\"abc\"[1] = %c\n", "abc"[1] ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { char string[4] = { 'a', 'b', 'c', '\0' }; /* { 'a', 'b', 'c', '\0' } = "abc" */ printf ( "string = %s\n", string ); printf ( "*string = %c\n", *string ); printf ( "string + 1 = %s\n", string + 1 ); printf ( "string[1] = %c\n", string[1] ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { char string[4] = { 'a', 'b', 'c', '\0' }; /* { 'a', 'b', 'c', '\0' } = "abc" */ printf ( "string = %s\n", string ); /* 文字配列なので、要素の一部の値を変更できる */ string[1] = 'X'; /* 'b' -> 'X' */ /* "abc" -> "aXb" */ printf ( "string = %s\n", string ); string[1] = '\0'; /* 'X' -> '\0' */ /* "aXc" -> "a\0c" */ /* -> "a" */ printf ( "string = %s\n", string ); string[1] = 'b'; string[3] = 'Y'; printf ( "string = %s\n", string ); return 0; }
/* * 2017/11/17 sample-001.c */ /* * 文字列の入力\n *\tscanf の「%s」で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-001.c * リンク * cc -o sample-001.exe sample-001.c * 実行 * ./sample-001.exe */ #include <stdio.h> /* * main 関数 * * 文字列を「入力」して、処理したい * 「入力」した情報を保持する変数が必要 * -> C 言語では「文字配列」が、 * 『文字列』を保持するために利用される */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); scanf ( "%s", line ); /* 書式は「%s」で、文字型配列名を直接使う(&)は不要 */ /* 文字列(文字配列)の出力は、 printf の "%s" だった。 [注意] line の前には、「&」と付けない cf. 単純型の変数の場合は、「&」が必要だったが.. # 理由は、来週いごに話す */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* 空白文字(空白/タブ/改行)があると、「文字列の区切」とみなされる */ /* scanf では、最初の空白文字までの文字列が文字配列に入力される。 ただし、この方法は(安易には)使ってはいけない */ return 0; }
/* * 2017/11/17 sample-002.c */ /* * 文字列の入力 (2)\n *\tgets で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-002.c * リンク * cc -o sample-002.exe sample-002.c * 実行 * ./sample-002.exe */ #include <stdio.h> /* * main 関数 */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); gets ( line ); /* gets では、「一行(改行の直前迄:改行含まず)」の文字列が入力される */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* gets は一行(改行)までを入力する */ return 0; }
/* * 2017/11/17 sample-003.c */ /* * 文字列の入力 (3)\n *\tfgets で文字列を入力する事ができる * * 利用方法 * コンパイル * cc -c sample-003.c * リンク * cc -o sample-003.exe sample-003.c * 実行 * ./sample-003.exe */ #include <stdio.h> /* * main 関数 */ #define LINE_SIZE 128 /* 入力する文字列より大きなサイズにする */ int main ( int argc, char *argv[] ) { char line[LINE_SIZE]; /* 入力する文字列を収める文字型配列 */ printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " ); fgets ( line, LINE_SIZE, stdin ); /* 入力先は、「標準入力 (stdin)」となる */ /* fgets では、文字列サイズが指定できる (安全) */ /* 指定したサイズより長い文字列は、入力が「待たされ」る */ printf ( "あなたが入力した文字列は「%s」です。\n", line ); /* 入力文字列内には、「改行」も含まれる */ return 0; }
?O?????e ?z?? ?z??:?u?????^?v??????????u????v????x???????? ??????????????????? ?Y??????p????A????v?f???u?Q??v????? ?Q?? : ?l?????o???????????A?????????? ?Y?????????u???v???????? -> ????????(????????????)?????????? ??:?P???????? int vi; ?uvi = ???v?????L?q????? ?u???v?????A????????鎖??????????? ???????A????????????? ????A?z????g????A ?Y??????????(???)?????鎖????A ??????A???????? for ?\???????????? #define ARRAY_SIZE 10 int i; int ary[ARRAY_SIZE]: for ( i = 0; i < ARRAY_SIZE; i++ ) { ary[i] ??? } -> ary ???????v?f??????u?W?????Z?v??????? -> ?f?[?^?\??????????A?v???O??????????? ?z???v?f??Q????????A ?z??[??] <-> *(?z?? + ??) ??A??????????? ????A ?u*?z??v??A?z?????v?f (?z??[0])??????? cf. ?????????????????? /* ?z??[??] == *(?z?? + ??) == *(?? + ?z??) == ??[?z??] */ ?u?z??v???u?l?v???????????A?u?v?Z?v????? ?u?l??????v-> ??????????A???l?????? ???????A?z?? [] ??g?????A* ??@?\?A??????????? etc.. ?u??????v??u?????^??z??v??u?????????v -> ?{???I???u?????v???? -> ???? ? ?u??????v??A?v?f??l???????????鎖???????? <-> ?????z???A?u?v?f??l?v???X?????B ?t??A ?????z???A?v?f??l??(?????R?[?h????鎖????????????..) ????????s?? ??????A?????R?[?h?????сA?r???? EOS'\0' ???????A ????????R?[?h????т?????????????????? ?u??????v??A?u?????z??v????????????? ????????? ?????????? ?????z???p????Afgets ???????? ?^??T?C?Y ?^???A?T?C?Y(byte ??)?????? sizeof(?^??)??A?^??T?C?Y??????
Download : 20171117-01.c
/* * 20171117-01-QQQQ.c * 一行文の文字列を入力して、その中の文字列を全て大文字に変換する */ #include <stdio.h> /* * islower (ch) : 指定された文字が、小文字かどうかを判定する */ int islower ( int ch ) { return 'a' <= ch && ch <= 'z'; /* 'a' 〜 'z' なら小文字 */ } /* * toupper ( ch ) : 指定された文字が、小文字なら大文字に変換 */ int toupper ( int ch ) { if ( islower ( ch ) ) { /* 小文字だった.. */ /* ** この部分を完成させなさい */ } else { /* そうでないなら */ return ch; /* そのまま返す */ } } /* * main */ #define EOS '\0' /* EOS を定義 */ #define LINE_SIZE 128 /* 入力するのに十分に大きなサイズにする */ int main ( void ) { char line[LINE_SIZE]; int i; printf ( "小文字を含んだ文字列を入力してください : " ); /* ** この部分を完成させなさい */ for ( i = 0; line[i] != EOS; i++ ) { line[i] = toupper ( line[i] ); /* 小文字を大文字に変換 */ } printf ( "結果 : %s", line ); return 0; }
小文字(abc)と大文字(ABC)を入力
$ ./20171117-01-QQQQ.exe 小文字を含んだ文字列を入力してください : 結果 : 小文字(ABC)と大文字(ABC)を入力 $