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)を入力 $