/*
* 20210604-01-QQQQ.c
* 「Hello, World」+[改行] を画面に出力するプログラム
*/
#include <stdio.h> /* printf 等の宣言が入っている */
/* printf や putchar を使う場合に必要 */
/*
* main
*/
int main ( void ) { /* main は C のプログラムに必ず必要 */
/* C 言語で作られるプログラム
main + main から(直接/間接に)呼ばれる、
関数の集合で表現 */
printf( "Hello, World\n" ); /* printf はライブラリから取り出される */
return 0; /* プログラムの終了のちに利用される */
}
/*
Hello, World は、色々なプログラムを作る出発点
*/
/*
* CDATE FILENAME
*
* キーボードから一文字入力し、その文字によって異る国の挨拶をする
* Input(入力) - Process(処理) - Output(出力) : IPO
*/
#include <stdio.h>
/*
* hello ( char contry )
* char contry : 国を表す一文字
* j : 日本
* e : 英語
* c : 中国
* f : フランス語
* g : ドイツ語
*/
void hello ( char cmd ) {
if ( cmd == 'j' ) { /* 'j' の時は、日本語にする */
printf ( "こんにちは\n" );
} else if ( cmd == 'e' ) { /* 'e' の時は、英語にする */
printf ( "Hello\n" );
} else if ( cmd == 'c' ) { /* 'c' の時は、中国語にする */
printf ( "ニイハオ\n" );
} else if ( cmd == 'f' ) { /* 'f' の時は、フランス語にする */
printf ( "Bonjour\n" );
} else if ( cmd == 'g' ) { /* 'g' の時は、ドイツ語にする */
printf ( "Guten tag\n" );
} else { /* どれでもなければ.. */
printf ( "???\n" );
}
}
/*
* main
*/
int main( void )
{
printf ( "国を表す文字を入力してください\n" );
printf ( "\tj\t日本\n" );
printf ( "\te\t英語\n" );
printf ( "\tc\t中国\n" );
printf ( "\tf\tフランス\n" );
printf ( "\tg\tドイツ\n" );
printf ( "> " );
hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */
return 0;
}
/*
* CDATE FILENAME
*
* キーボードから一行(改行まで..)文字列を読込み、それを逆順に出す
*/
#include <stdio.h>
/*
* reverse ( char contry )
* char cmd : どのメッセージにするかを表す文字
*
*/
void reverse_line ( char ch ) {
if ( ch == '\n' ) { /* 改行ならば.. */
/* なにもしなくてよい */
} else { /* そうでなければ.. */
/*
putchar ( ch );
reverse_line ( getchar() );
このパターンだと、入力した結果をそのまま出す
abc
a bc
a -> putchar
bc -> 再帰
*/
reverse_line ( getchar() );
putchar ( ch );
/*
入力した結果を逆順にしたい場合は
cba
cb a
cb -> 再帰
a -> putchar
*/
}
}
/*
* main
*/
int main( void )
{
reverse_line ( getchar() ); /* 最初の文字を読み込んで .. */
putchar ( '\n' ); /* 改行を出力 */
return 0;
}
/*
* 20210611-01-QQQQ.c
* 英小文字を英大文字に、英大文字を英小文字に入れ替える関数
*/
#include <stdio.h>
/*
* char change_up_lower ( char ch )
* 引数で指定された文字が大英文字なら英小文字に、英小文字なら英大文字にする
*/
char change_up_lower ( char ch ) {
/* 英大文字の処理 */
if ( 'A' <= ch ) { /* もし、 ch が 'A' 以上で .. */
if ( ch <= 'Z' ) { /* しかも、 'Z' 以下 なら .. */
/* 引数は英大文字だったので、英小文字に変換し、値を返す */
return ch - 'A' + 'a';
}
}
/* 英小文字の処理 */
if ( 'a' <= ch ) { /* もし、 ch が 'a' 以上で .. */
if ( ch <= 'z' ) { /* しかも、 'z' 以下 なら .. */
/* 引数は英小文字だったので、英大文字に変換し、値を返す */
return ch - 'a' + 'A';
}
}
/* 何れでもない場合 */
return ch; /* 引数の値をそのまま、関数の値として返す */
}
/*
* main
*/
int main ( void ) {
/* 英大文字 ( 'Q' ) の場合 */
printf ( "英大文字 ( 'Q' ) の場合 「" );
putchar ( change_up_lower ( 'Q' ) );
printf ( "」となります。\n" );
/* 英小文字 ( 'h' ) の場合 */
printf ( "英小文字 ( 'h' ) の場合 「" );
putchar ( change_up_lower ( 'h' ) );
printf ( "」となります。\n" );
/* 何方でもない ( '4' ) の場合 */
printf ( "何方でもない ( '4' ) 場合 「" );
putchar ( change_up_lower ( '4' ) );
printf ( "」となります。\n" );
return 0;
}
#include <stdio.h>
int main(void) {
printf ( 'A' ); /* printf の引数は「文字列」*/
/* 引数に「文字」を指定してみた */
/* =>
コンパイル時には、ワーニング(警告)が出る
引数に「文字列」を指定すべきなのに、
「文字列でない『文字』」をしていしている
*/
/*
リンクして実行ファイルは作れるが、
正しい(期待した..)結果にはならない
*/
return 0;
}
#include <stdio.h>
int main(void) {
printf ( "A" ); /* printf が期待してる「文字列」を与える */
/* =>
コンパイルもリンクも問題ないし、
実行結果も期待した通りになる
*/
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( 'A' ); /* 「A」という文字を画面に出力する */
putchar ( '\n' ); /* 改行する */
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( getchar() ); /* getchar() によってキーボードから一文字入力し、それを出力する */
putchar ( '\n' ); /* 改行する */
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( getchar() + 1 );
/* 入力した文字の、(ASCII コード表の)次の文字を出力する */
putchar ( '\n' );
return 0;
}
#include <stdio.h>
/*
数字を二文字入力すると、
その数字が表す数値の和を計算する
12 <= 入力
'1' => '1' - '0' = 1 という数値
'2' => '2' - '0' = 2 という数値
1 + 2 -> 3 という数値
3 + '0' => '3' という数字(を表す ASCII コード)
putchar で出力すると、「3」と表示される
=>
あたかも、二つ数の和の計算をしているように見える
*/
int main(void) {
putchar (
( getchar() - '0' )
+
( getchar() - '0' )
+
'0'
);
putchar ( '\n' );
return 0;
}
#include <stdio.h>
int main(void) {
printf ( "Hello, World\n" );
getchar(); /* キーボードからの入力待ち */
/* => エンターキーを押すと、文字(改行)の入力がなされ、
その入力された文字データは、捨てられる
<= 副作用として、
プログラムを一時停止して、
再開の指示待つために利用される
*/
return 0;
}
#include <stdio.h>
/*
キーボードから一文字入力して、
Y/y => Yes
N/n => No
その他 => ?
*/
void process ( char ch ) { /* 処理関数 */
/* 引数は「文字」なので、仮引数変数(ch)の型は「char」型 */
if ( ch == 'Y' ) { /* ch (という文字コードを持つ変数の値が..) 文字 'Y' に等しい */
printf ( "Yes\n" ); /* 出力として「Yes」を出力する */
} else if ( ch == 'y' ) {
printf ( "Yes\n" );
} else if ( ch == 'N' ) {
printf ( "No\n" );
} else if ( ch == 'n' ) {
printf ( "No\n" );
} else {
printf ( "?\n" );
}
}
int main(void) {
process ( getchar() ); /* キーボードから一文字入力する */
/* 入力した文字は、関数 process に渡す */
return 0;
}
/*
イメージ
+-- Yes
キーボード : 入力 -> 処理 -> 出力--+-- No
+-- ?
*/
#include <stdio.h>
#include <string.h>
/*
文字列を == で比較するとどうなるか ?
*/
void string_compare ( char *a, char *b ) {
printf ( "a=「" );
printf ( a );
printf ( "」\n" );
printf ( "b=「" );
printf ( b );
printf ( "」\n" );
if ( a == b ) {
/* 何をもって「同じ」としているかがよくわからない.. */
/* => 文字の時にはうまくゆくが、文字列の時には、信頼できない .. */
/* 実は... (後日) */
printf ( "==:等しい\n" );
} else {
printf ( "==:等しくない\n" );
}
if ( !strcmp ( a, b ) ) {
/* 「同じ文字列」<=> 「同じ文字の列からなる」 */
printf ( "sc:等しい\n" );
} else {
printf ( "sc:等しくない\n" );
}
}
int main(void) {
string_compare ( "abc", "abc" );
string_compare ( "0abc" + 1, "1abc" + 1 );
return 0;
}
#include <stdio.h>
/*
キーボードから入力された一行(改行で終わる..)文字列を、
画面に出力する
入力
abc[改行]
出力
abc[改行]
!! 一番簡単な場合
入力
[改行]
出力
[改行]
!! 次の例
入力
a[改行]
出力
a[改行]
一般化
入力
abc..z[改行]
出力
abc..z[改行]
a
getcharしたものをputchar
bc..z[改行]
再帰が利用できる
入力と再帰を組み合わせる場合は、
入力結果を利用して、
判断と、処理の両方をする必要がある
関数の実引数に、入力(getchar())を与えて、
関数の中で、その値を仮引数変数を経由して
参照する必要がある
入力関数(getchar())の副作用を、うまく回避する方法
=> 「先読み」
*/
void echo_line ( char ch ) {
if ( ch == '\n' ) {
putchar ( '\n' );
} else {
putchar ( ch ); /* 入力されたものを出力した */
echo_line ( getchar() ); /* 次の文字も入力して */
/* 残り部分の処理を行う */
/* 再帰呼び出しで処理 */
}
}
int main(void) {
echo_line ( getchar() );
return 0;
}
#include <stdio.h>
/*
キーボードから入力された一行(改行で終わる..)文字列を、
画面に出力する
失敗例
1 2 3 4 5 6 7 8 9
^
14 17* 14 17*
*/
void echo_line ( void ) {
if ( getchar() == '\n' ) {
putchar ( getchar() );
} else {
putchar ( getchar() );
echo_line ( );
}
}
/*
getchar() 関数が呼びだされるたびに、新しい文字を読み込むので、
条件で利用する値と、出力する値が異なってしまう
=> 入力を行う「副作用」の制御ができてない
*/
int main(void) {
echo_line();
return 0;
}
#include <stdio.h>
/*
キーボードから入力された一行(改行で終わる..)文字列を、
画面に出力する
入力
abc[改行]
出力
abc[改行]
!! 一番簡単な場合
入力
[改行]
出力
[改行]
!! 次の例
入力
a[改行]
出力
a[改行]
一般化
入力
abc..z[改行]
出力
abc..z[改行]
a
getcharしたものをputchar
bc..z[改行]
再帰が利用できる
入力と再帰を組み合わせる場合は、
入力結果を利用して、
判断と、処理の両方をする必要がある
関数の実引数に、入力(getchar())を与えて、
関数の中で、その値を仮引数変数を経由して
参照する必要がある
入力関数(getchar())の副作用を、うまく回避する方法
=> 「先読み」
*/
void echo_line ( char ch ) {
if ( ch == '\n' ) {
putchar ( '\n' );
} else {
putchar ( ch + 1 ); /* 入力されたもの次を出力した */
echo_line ( getchar() ); /* 次の文字も入力して */
/* 残り部分の処理を行う */
/* 再帰呼び出しで処理 */
}
}
int main(void) {
echo_line ( getchar() );
return 0;
}
#include <stdio.h>
/*
指定された英大文字を小文字に変換して返す関数
*/
char tolower ( char ch ) {
/* 引数として「文字」を与えるので、「char」型の仮引数変数 */
/* 返り値として「文字」を返すので、「char」型の関数宣言 */
return ch - 'A' + 'a';
/*
'A' => 'A' - 'A' = 0 => 0 + 'a' => 'a'
'B' => 'B' - 'A' = 1 => 1 + 'a' => 'b'
..
'Z' => 'Z' - 'A' = 26 => 26 + 'a' => 'z'
*/
}
int main(void) {
putchar ( tolower( 'A' ) );
putchar ( tolower( 'Q' ) );
putchar ( tolower( '@' ) ); /* ASCII Code 表から「`」*/
putchar ( '\n' );
return 0;
}
#include <stdio.h>
/*
指定された英大文字を小文字に変換して返す関数
Verion 2.
英大文字の時だけ小文字に、
そうでないときは、そのままの文字を返す
*/
char tolower ( char ch ) {
/* 英大文字かどうか判定する */
/* 'A' <=「英大文字」 <= 'Z' */
/*
if ( 'A' <= ch <= 'Z' ) としたいところだが... だめ
=>
「'A' <= ch」の条件と「ch <= 'Z'」の条件が両方成立
*/
if ( 'A' <= ch ) {
if ( ch <= 'Z' ) {
/* 二つの条件の両方が成立した場合 */
return ch - 'A' + 'a'; /* 英大文字を英小文字に変換 */
} else {
return ch; /* 英大文字ではないので、そのまま返す */
}
} else {
return ch; /* 英大文字ではないので、そのまま返す */
}
}
int main(void) {
putchar ( tolower( 'A' ) );
putchar ( tolower( 'Q' ) );
putchar ( tolower( '@' ) ); /* 英大文字でないので「@」がそのまま */
putchar ( '\n' );
return 0;
}
#include <stdio.h>
/*
指定された英大文字を小文字に変換して返す関数
Verion 3.
return 命令が、関数を終了(中断)させる性質の利用
*/
char tolower ( char ch ) {
if ( 'A' <= ch ) {
if ( ch <= 'Z' ) {
/* 二つの条件の両方が成立した場合 */
return ch - 'A' + 'a'; /* 英大文字を英小文字に変換 */
/* ここで、関数が終了するので.. 23 行目は実行されない */
} else {
/* do nothing */
}
} else {
/* do nothing */
}
return ch; /* 英大文字ではないので、そのまま返す */
}
int main(void) {
putchar ( tolower( 'A' ) );
putchar ( tolower( 'Q' ) );
putchar ( tolower( '@' ) ); /* 英大文字でないので「@」がそのまま */
putchar ( '\n' );
return 0;
}
?O??(2021/06/04)????e
??T????????
?????
C ?????O????w??
???????? ( ?????I???A????鎖???????????????????? )
?u????鎖?v:?????????o?????
=> ?R?[?f?B???O(??????I?? 1 ?? 1 ??????????????l????)
=> ?C???u??????I?v?????????u??????v???o??????
??: 1 ?i?@
?u???R???v???u???????????v??\???????i(?R?[?f?B???O???i????)
=> ?u???R????v?Z?v??????v???O????
# ???R????v?Z?????\?? 1 ?i?@??????????o?????
?????
?????AC ????? 0 ????w?т????
=> ?v?Z?@????邱??? C ????????(?\??)???????????
??: ?O???t?B?b?N?X
?uHello, World?v???
????P????v???O???? : Hello, World
?????v???O???~???O : ????????C???????????????????s??
?uHello, World?v???
???:?u#include?v/?uint?v/?ureturn 0;?v???????????? ??
???
????????O???????????
?????` : ???????O??t???? ( <= ???????`????? )
?????яo?? : ???????p????A??????O????????????????яo??
????? : ??????`??????????
????? : ?????`??\???????????????O??????????
void func(void) { .. }
^^^^^^^^^^^^^^^ ^^^^^^
??????? ????{??
??????A??????t???鎖???????
?????????????????
??T?? : ?????????A?u??????v???????????
=> ????????????????????????uchar *?v??????u?????????v
?u?????????????v
=> ??????????u?^?v???w???????
?u?^?v: ?f?[?^??????l??W?? + ????????????鉉?Z??W???
?? : ???? <=> < { .., -2, -1, 0, 1, 2, .. }, {+,-,*,/} >
=> ?f?[?^??????l??W?????????^??????????
???w : <Q,{+}> -> ?u?Q?v????鎖??????????
<Q,{+,*}> -> ?u??v????鎖???????
!! ???w??F?X??u???v??A?^?????????????
???????????^??????
?????K?p(???????яo??)???A
?????????A?????K?????u?^?v??f?[?^??^????K?v??????
??:
printf ???????u??????v
putchar ???????u?????v
!! ???????????A(??????????????????..?^??)
!! ?K???f?[?^??^????K?v??????
!! ???w : ???????????????????????A????????^????K?v??????
!! => ??????`??
?^?? (??????????? char ??)
?u?^?v: ?l??W???????????A?????????Z?q?????????
[2021/06/11]
????
?o?? : putchar ?????p <= ??????????????????
???? : getchar ???
?L?[?{?[?h??????????????A
?????????????
<= ?v???O??????????A?u????v???????
=> getchar???????A?v???O????????A?L?[?{?[?h????????????????????(?v?Z????/????????????)?????????
getchar ??p???鎖????A
?v???O???????{?p?^?[?????? : ?u????->????->?o??v????\??
???????r
???????? ( ?????????? )
=> ?u??????????A?????????????????????s????v??????\??
=> if ?\??
if ( ???? ) {
?????????????????????
} else {
???????s????????????(?????O)
}
?u?????v
????? : !strcmp ??p????A?u????????r?v??????
!strcmp(A,B)
?????? A ??????? B ?????????????????A
?^(????????)????
????? :
?u?????v???r???????
???? A, B ???^?????????
A == B => A ?? B ??????? ( A ?? B ???????? )
A != B => A ?? B ??????????
A < B => A ?? B ???(ASCII ?R?[?h?\??????..) ?O
?? : 'A' < 'B', '0' < '1', 'A' < 'a'
A > B => A ?? B ???(ASCII ?R?[?h?\??????..) ??
A <= B => A ?? B ???
A >= B => A ?? B ???
??????A?I??`
?????: ??????`?????????{???A???????g????яo??
??????????????g????яo????A???????[?v????
???I???(???????[?v?????????)?A
?????????p????A
???????g????яo????????????????????
=> ???????g????яo???????A
??????l???X???鎖????A
??I?I??A???????g????яo????????????
void rec( V ) {
if ( V ??????I?????? ) {
??A?????
} else {
???? ( ?J???????????e )
rev ( V' );
<= ??A??яo???????????A
??????l???X???A
???????X??????A??I?I??A
V??????I??????????????????????
!! ????:
!! ????????????^???A
!! ??A??яo????????????A????????????Z??????
!! ?I?????????A?u???????????? 0 ????v??????
!! cf.
!! ???w?I?A?[?@
!! ??????????, n = 0 ( n = 1 )
!! n ??l??????
!! \forala n \in N P(n)
!! <=>
!! P(0)
!! P(k) -> P(k+1)
!! <=
!! P(3) ?
!! P(3) <= P(2)
!! P(2) <= P(1)
!! P(1) <= P(0)
!! P(0)
}
C ???????
=> ???????O???????????
cf.
???w??u????v
??`??A?l?悪?????????????A
??`???C???v?f x ??????A?n???v?f y ??
?????????K?????
??:
f(x) = x^3
??`?? : ???? R
?l??? : ???? R
????K?? : x -> x * x * x ??????????
?????l : ???I??l??????K?p???????????
f(2) = 2 * 2 * 2 = 8
!! ??????w??uC ?????w????x?v??A
!! ??????^??????邪?A??????????l??A?s??(?w????????)
!! ?B??Agetchar() ??A??????l(?L?[?{?[?h????????????)????????A
!! ????I???????????..
????..
C ??????????A?u?l?v????????????A
????A????u?l?v???v???O??????????p???鎖???????
=> ???l????????(?l???????)???`???@
???l???????????`??d??
????????????O(??????? void)??A
?u????l??^?v??????????
# void ??A?u?l????????v????????????
# cf.
# ????????????????uvoid?v???????
# ?u??????????????v????
# => ?uvoid?v=>?u??????????v
????{???
return ??
????????????????A
???????l(????l)?????A?u???v??l???w?????
return ????????s???????_??A?????I??????
C ??????????A
???w????????l??A
?????????A???l???????A?K?????v???O????????????
!! ???????w????????l?????? C ???????????鎖???????
!! ??????????^??????l??^????A
!! (???w???????????..) ??`???l????????????
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210611-01.c
/*
* 20210611-01-QQQQ.c
* 英小文字を英大文字に、英大文字を英小文字に入れ替える関数
*/
#include <stdio.h>
/*
* char change_up_lower ( char ch )
* 引数で指定された文字が大英文字なら英小文字に、英小文字なら英大文字にする
*/
char change_up_lower ( char ch ) {
/* 英大文字の処理 */
if ( 'A' <= ch ) { /* もし、 ch が 'A' 以上で .. */
if ( ch <= 'Z' ) { /* しかも、 'Z' 以下 なら .. */
/* 引数は英大文字だったので、英小文字に変換し、値を返す */
return ch - 'A' + 'a';
}
}
/* 英小文字の処理 */
if ( 'a' <= ch ) { /* もし、 ch が 'a' 以上で .. */
if ( ch <= 'z' ) { /* しかも、 'z' 以下 なら .. */
/* 引数は英小文字だったので、英大文字に変換し、値を返す */
/*
** この部分を完成させなさい
*/
}
}
/* 何れでもない場合 */
return ch; /* 引数の値をそのまま、関数の値として返す */
}
/*
* main
*/
int main ( void ) {
/* 英大文字 ( 'Q' ) の場合 */
printf ( "英大文字 ( 'Q' ) の場合 「" );
putchar ( change_up_lower ( 'Q' ) );
printf ( "」となります。\n" );
/* 英小文字 ( 'h' ) の場合 */
printf ( "英小文字 ( 'h' ) の場合 「" );
/*
** この部分を完成させなさい
*/
printf ( "」となります。\n" );
/* 何方でもない ( '4' ) の場合 */
printf ( "何方でもない ( '4' ) 場合 「" );
putchar ( change_up_lower ( '4' ) );
printf ( "」となります。\n" );
return 0;
}
$ ./20210611-01-QQQQ.exe 英大文字 ( 'Q' ) の場合 「q」となります。 英小文字 ( 'h' ) の場合 「H」となります。 何方でもない ( '4' ) 場合 「4」となります。 $
Download : 20210611-02.c
/*
* 20210611-02-QQQQ.c
* 指定した文字列の中の英小文字を英大文字に、英大文字を英小文字に入れ替えて出力する関数
*/
#include <stdio.h>
#define EOS '\0' /* マクロ(EOS) を、NULL 文字 '\0' で定義 */
/* 以下の結果は、20210611-01-QQQQ.c の内容を、そのまま利用する */
/*
* char change_up_lower ( char ch )
* 引数で指定された文字が大英文字なら英小文字に、英小文字なら英大文字にする
*/
char change_up_lower ( char ch ) {
/* 英大文字の処理 */
if ( 'A' <= ch ) { /* もし、 ch が 'A' 以上で .. */
if ( ch <= 'Z' ) { /* しかも、 'Z' 以下 なら .. */
/* 引数は英大文字だったので、英小文字に変換し、値を返す */
return ch - 'A' + 'a';
}
}
/* 英小文字の処理 */
if ( 'a' <= ch ) { /* もし、 ch が 'a' 以上で .. */
if ( ch <= 'z' ) { /* しかも、 'z' 以下 なら .. */
/* 引数は英小文字だったので、英大文字に変換し、値を返す */
/*
** この部分を完成させなさい
*/
}
}
/* 何れでもない場合 */
return ch; /* 引数の値をそのまま、関数の値として返す */
}
/*
* void print_change_up_lower_string ( char *string )
* 引数で指定した文字列の中の英小文字を英大文字に、
* 英大文字を英小文字に入れ替えて出力する関数
*/
void print_change_up_lower_string ( char *string ) {
if ( *string == EOS ) { /* 空文字列 ("") だった.. */
/* 何もしない */
} else {
/* 取り敢えず、先頭の文字だけ変換を行って、出力 */
putchar ( change_up_lower ( *string ) );
/* 残りの文字列は、再帰で処理 */
print_change_up_lower_string ( string + 1 );
}
}
/*
* main
*/
int main ( void ) {
printf ( "Aa0BB11cc@+\nXy" );
print_change_up_lower_string ( "Aa0BB11cc@+Xy\n" );
return 0;
}
$ ./20210611-02-QQQQ.exe Aa0BB11cc@+ XyaA0bb11CC@+xY $
Download : 20210611-03.c
/*
* 20210611-03-QQQQ.c
* 10 未満の長さの文字列の長さを表す一文字の数字を返す関数
*/
#include <stdio.h>
#define EOS '\0' /* マクロ(EOS) を、NULL 文字 '\0' で定義 */
/*
* char length_of_string ( char *string )
* 引数の文字列の長さを表す、一桁の数字を返す関数
* 文字列の長さは一桁の場合しか、「適切に動作」しない
*/
char length_of_string ( char *string ) {
if ( *string == EOS ) { /* 空文字列なら、長さは 0 */
return '0'; /* 長さ「0」を表す『文字(数字)』「'0'」を返す */
} else {
/* 一文字分短い『文字列』の長さを再帰で求め、それに 1 を加える */
/*
** この部分を完成させなさい
*/
}
}
/*
* main
*/
int main ( void ) {
printf ( "文字列「\"abc\"」の長さは " );
putchar ( length_of_string ( "abc" ) );
printf ( " です。\n" );
printf ( "文字列「\"123456\"」の長さは " );
putchar ( length_of_string ( "123456" ) );
printf ( " です。\n" );
/* 長さが 10 を越える場合は、不適切な結果になる */
printf ( "文字列「\"1234567890123\"」の長さは " );
putchar ( length_of_string ( "1234567890123" ) );
printf ( " です。\n" );
return 0;
}
$ ./20210611-03-QQQQ.exe 文字列「"abc"」の長さは 3 です。 文字列「"123456"」の長さは 6 です。 文字列「"1234567890123"」の長さは = です。 $