ここでは、文字とはASCIIに割当のある文字を意味しています。漢字や仮名は含まれないと仮定してください。
課題で文字列を入力とする場合、スペース、タブ、改行などの空白文字は文字列に含まれないと仮定してかまいません。
特に断りがなければ、入力文字列の長さは99以下と仮定してかまいません。
今回の課題で「string.h」で宣言される関数を使うことは許されません。
プログラムのデバッグをしているとき、長い入力を何度も入力するのは面倒です。そんなときは、入力用のテキストファイルを1つ準備しましょう。そうしておけば、次のようなコマンドをシェルで使うことができます。
./your-program < input.txt
これだけで、「input.txt」の中身が「./your-program」の入力として使われます。入力が見えない以外は、普段の実行と変わりありません。
効率よくプログラミングを学習する上で、シェルの活用は重要です。普段から、ファイルの名前を変更する操作などをシェル上で行って慣れておくとよいでしょう。
下のコードの空欄を埋めて、文字列nameを、ポインタを使って一文字ずつ改行区切りで表示させるプログラムを作成せよ。(抜けている部分だけでなく、ファイル全体を提出すること。)
#include <stdio.h>
int main(void){
char name[] = "Hello,world!";
char *p;
/* ここを埋める。 */
return 0;
}
注1:name[0]などを用いず、ポインタで表すこと
注2:ヌル文字は出力しないこと。(追記: 2021/10/18)
締切: 10/2223:59
任意の文字列name(100文字以内)を入力し、先頭の文字を順々に削除した文字列を一行ずつ表示するプログラムを作成せよ。例えば、name = Hello,World!の場合は、一行目は「Hello, World!」, 二行目は「ello,World!」、三行目は「llo,World!」となる。但し、printf("%s", name[0])などは使わず、ポインタを使用すること。
注1: 一重ループ(for文)を用いた場合に加え、二重ループ(for文の中でもう一つfor文を書くこと)を用いたプログラムも正解とします。
締切: 10/20 23:59
文字列sの中に、文字'a'が含まれている個数を返す関数str_chnumを作成せよ。ただし、「main」は以下をそのまま使用すること。
#include <stdio.h>
int main(void){
char s[100] = "";
int c = 'a';
scanf("%99s", s);
printf("%d\n", str_chnum(s, c));
return 0;
}
締切: 10/22 23:59
文字列sの文字の並びを反転する関数rev_stringを作成せよ。ただし、「main」は以下をそのまま使用すること。
#include <stdio.h>
int main(void){
char s[100] = "";
scanf("%99s", s);
rev_string(s);
printf("%s\n", s);
return 0;
}
締切: 10/22 23:59
参考: 演習9-8
2つの文字列を入力として受け取って、それらが同じ文字列なら「OK」、違っていれば「NG」と表示するプログラムを作成せよ。
締切: 10/22 23:59
参考: 教科書9章
文字列aの中身を文字列bで上書きする関数str_copyを作成せよ(入力が出力と一致するようにせよ)。但し、a[i] = b[i]などの表現ではなく、ポインタを用いること。
#include <stdio.h>
int main(void){
char a[100] = "Hello,world!";
char b[100];
/* 100文字以下の文字を入力 */
scanf("%99s", b);
str_copy(a, b);
printf("%s\n", a);
return 0;
}
締切: 10/22 23:59