C/C++ ポインタ入門 > 基礎 演習問題
Nobuhide Tsuda
Oct-2013
※ テストコードを用意しているので、それをダウンロードし、利用しなさい。
※ まずは正しく動作するプログラムを作成することを目標にしなさい。
全テストケースをパスするからといって、正しいプログラムとは限りません。
泥縄的にテストケースをパスするように修正するのは止めましょう。
なるべく余分な作業領域は使用しないようにしなさい。
※ それができたら、単に答えが合っているだけでなく、できるだけトークン数の少ない簡潔なコードを書きなさい。
トークン数が解答例より極端に多い(1.5倍程度以上)場合は、コードの見直しをしなさい。
トークン数の定義についてはここを参照しなさい。
演習問題
- ★int my_strlen(const char *str) 引数に文字列をとり、文字列の長さを返す関数を実装しなさい。
- my_strlen("abc") が3を返すのを確認しなさい
- my_strlen("a\tb\nc") が5を返すのを確認しなさい
- my_strlen("") が0を返すのを確認しなさい
- my_strlen("あいうえお") が何を返すか確認しなさい
- テストコード、
解答例(トークン数:27)
- この問題が解けたらツイートしてね:
- ★int my_count_char(const char *str, char c)
文字列 str に文字 c が何個含まれるかを返す関数を実装しなさい。
- my_count_char("3.1415926535", '5') が 3 を返すことを確認しなさい
- my_count_char("3.1415926535", '0') が 0 を返すことを確認しなさい
- my_count_char("3.1415926535", '3') が 2 を返すことを確認しなさい
- my_count_char("", '3') が 0 を返すことを確認しなさい
- テストコード、
解答例(トークン数:37)
- この問題が解けたらツイートしてね:
- ★const char *my_strchr(const char *str, char c) 引数に 文字列 str、文字 c をとり、文字列中に文字cがあれば、
そこへのポインタを返す関数を実装しなさい。文字列中に文字cが無い場合は0を返しなさい。
- my_strchr("", 'x') が、0 を返すのを確認しなさい
- my_strchr("abc", 'x') が、0 を返すのを確認しなさい
- my_strchr("abcabc", 'a') が、"abcabc" のアドレスを返すのを確認しなさい
- my_strchr("abc", 'c') が、"abc" の 'c' のアドレスを返すのを確認しなさい
- テストコード、
解答例(トークン数:34)
- この問題が解けたらツイートしてね:
- ★ char my_maxchar(const char *str)
引数文字列 str の中で、文字コードが最も大きい文字を返しなさい。str が空文字列の場合は 0 を返しなさい。
- my_maxchar("31415926535") が '9' を返すのを確認しなさい。
- my_maxchar("XYZabc123") が 'c' を返すのを確認しなさい。
- my_maxchar("") が 0 を返すのを確認しなさい。
- テストコード、
解答例(トークン数:41)
- この問題が解けたらツイートしてね:
- ★ const char *my_maxcharptr(const char *str)
引数文字列 str の中で、文字コードが最も大きい文字へのポインタを返しなさい。
最も大きい文字が複数ある場合は、最も大きい文字の中で最初の文字へのポインタを返しなさい。
str が空文字列の場合は、0 を返しなさい。
- my_maxcharptr("31415926535") が '9' へのポインタを返すのを確認しなさい。
- my_maxcharptr("XYZabc123") が 'c' へのポインタを返すのを確認しなさい。
- my_maxcharptr("abcXYZabc123") が、先頭から3番めの 'c' へのポインタを返すのを確認しなさい。
- my_maxcharptr("") が 0 を返すのを確認しなさい。
- テストコード、
解答例(トークン数:56)
- この問題が解けたらツイートしてね:
- ★void my_strfill(char *dst, char c, int n) 文字配列 dst に、文字 c を n 個設定し、
最後にヌル文字('\0')を設定する関数を実装しなさい。dst は充分な領域が確保されていると仮定してよい
- char buf[10]; my_strfill(buf, 'a', 3); を実行し、buf の中身が "aaa" であることを確認しなさい。
- 次に、my_strfill(buf, 'x', 5); を実行し、buf の中身が "xxxxx" であることを確認しなさい。
- 次に、my_strfill(buf, 'a', 0); を実行し、buf の中身が "" であることを確認しなさい。
- テストコード、
解答例(トークン数:38)
- この問題が解けたらツイートしてね:
- ★void my_erase_head(char *str, int n)
文字列 str の先頭 n バイトを削除し、その後の文字列を前に移動する関数を実装しなさい。n が str の文字数より大きい場合は str を空文字列にしなさい。
- char v1[] = "abcxyz"; my_erase_head(v1, 3); を実行し、v1 の内容が "xyz" になっていることを確認しなさい。
- char v2[] = "abcxyz"; my_erase_head(v2, 4); を実行し、v2 の内容が "yz" になっていることを確認しなさい。
- char v3[] = "abcxyz"; my_erase_head(v3, 0); を実行し、v3 の内容が "abcxyz" のままであることを確認しなさい。
- char v4[] = "abc"; my_erase_head(v4, 6); を実行し、v4の内容が "" になっていることを確認しなさい。
- char v5[] = ""; my_erase_head(v5, 7); を実行し、v5 の内容が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:54)
- この問題が解けたらツイートしてね:
- ★void my_erase_tail(char *str, int n)
文字列 str の末尾 n バイトを削除する関数を実装しなさい。n が str の文字数より大きい場合は str を空文字列にしなさい。
- char v1[] = "abcxyz"; my_erase_tail(v1, 3); を実行し、v1 の内容が "abc" になっていることを確認しなさい。
- char v2[] = "abcxyz"; my_erase_tail(v2, 4); を実行し、v2 の内容が "ab" になっていることを確認しなさい。
- char v3[] = "abcxyz"; my_erase_tail(v3, 0); を実行し、v3 の内容が "abcxyz" のままであることを確認しなさい。
- char v4[] = "abc"; my_erase_tail(v4, 6); を実行し、v4の内容が "" になっていることを確認しなさい。
- char v5[] = ""; my_erase_tail(v5, 3); を実行し、v5 の内容が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:40)
- この問題が解けたらツイートしてね:
- ★void my_push_back(char *str, char c)
文字列 str の末尾に、文字 c を追加する関数を実装しなさい。str には充分な領域があると仮定してよい。
c がヌル文字('\0')の場合は、何も処理をしなくてよい
- char buf[10] = ""; my_push_back(buf, '1'); を実行し、buf の中身が "1" であることを確認しなさい。
- 続けて my_push_back(buf, '2'); を実行し、buf の中身が "12" であることを確認しなさい。
- 続けて my_push_back(buf, '3'); を実行し、buf の中身が "123" であることを確認しなさい。
- 続けて my_push_back(buf, '\0'); を実行し、buf の中身が "123" であることを確認しなさい。
- テストコード、
解答例(トークン数:31~35)
- この問題が解けたらツイートしてね:
- ★void my_push_front(char *str, char c)
文字列 str の先頭に、文字 c を挿入する関数を実装しなさい。str には充分な領域があると仮定してよい。
c がヌル文字('\0')の場合は、何も処理をしなくてよい
- char buf[10] = ""; my_push_front(buf, '1'); を実行し、buf の中身が "1" であることを確認しなさい。
- 続けて my_push_front(buf, '2'); を実行し、buf の中身が "21" であることを確認しなさい。
- 続けて my_push_front(buf, '3'); を実行し、buf の中身が "321" であることを確認しなさい。
- 続けて my_push_front(buf, '\0'); を実行し、buf の中身が "321" であることを確認しなさい。
- テストコード、
解答例(トークン数:39~58)
- この問題が解けたらツイートしてね:
- ★char my_pop_back(char *str)
文字列 str の末尾文字を削除し、削除した文字を返す関数を実装しなさい。str が空文字列の場合はヌル文字('\0')返しなさい
- char buf[] = "abcd"; に対して、my_pop_back(buf) が 'd' を返し、buf が "abc" であることを確認しなさい。
- 再度 my_pop_back(buf) をコールすると 'c' を返し、buf が "ab" であることを確認しなさい。
- 再度 my_pop_back(buf) をコールすると 'b' を返し、buf が "a" であることを確認しなさい。
- 再度 my_pop_back(buf) をコールすると 'a' を返し、buf が "" であることを確認しなさい。
- 再度 my_pop_back(buf) をコールすると '\0' を返し、buf が "" であることを確認しなさい。
- テストコード、
解答例(トークン数:48)
- この問題が解けたらツイートしてね:
- ★char my_pop_front(char *str)
文字列 str の先頭文字を削除し、削除した文字を返す関数を実装しなさい。str が空文字列の場合はヌル文字('\0')返しなさい
- char buf[] = "abcd"; に対して、my_pop_front(buf) が 'a' を返し、buf が "bcd" であることを確認しなさい。
- 再度 my_pop_front(buf) をコールすると 'b' を返し、buf が "cd" であることを確認しなさい。
- 再度 my_pop_front(buf) をコールすると 'c' を返し、buf が "d" であることを確認しなさい。
- 再度 my_pop_front(buf) をコールすると 'd' を返し、buf が "" であることを確認しなさい。
- 再度 my_pop_front(buf) をコールすると '\0' を返し、buf が "" であることを確認しなさい。
- テストコード、
解答例(トークン数:41)
- この問題が解けたらツイートしてね:
- ★void my_strcpy(char *dst, const char *src) 引数に 文字列 src, コピー先 dst をとり、src を dst にコピーする関数を実装しなさい。
- char dst[10]; char *src = "abc123"; を使い、my_strcpy(dst, src); でコピーし、
dst の内容が "abc123" になっていることを確認なさい
- テストコード、
解答例(トークン数:26)
- この問題が解けたらツイートしてね:
- ★int my_size(const int *first, const int *last)
first から last 直前までのデータ数を返す関数を実装しなさい。first > last の場合は考慮しなくてよい。
- int v[] = {1, 2, 3, 4, 5}; に対して my_size(v, v+5) が 5 を返すことを確認しなさい。
- my_size(v+1, v+4) が 3 を返すことを確認しなさい。
- my_size(v+2, v+2) が 0 を返すことを確認しなさい。
- テストコード、
解答例(トークン数:18)
- この問題が解けたらツイートしてね:
- ★int my_accumulate(const int *first, const int *last)
first から last の直前までポインタが指すデータを合計した値を返す関数を実装しなさい。first <= last と仮定してよい。
- int v1[] = {1, 2, 3, 4, 5}; に対して my_accumulate(v1, v1 +5) が 15 を返すことを確認しなさい。
- int v2[] = {1, 2, 2, 3, 3}; に対して my_accumulate(v2, v2 +5) が 11 を返すことを確認しなさい。
- int v3[] = {2, 2, 2, 2, 2}; に対して my_accumulate(v3+1, v3 +4) が 6 を返すことを確認しなさい。
- my_accumulate(v1, v1) が 0 を返すことを確認しなさい
- テストコード、
解答例(トークン数:33)
- この問題が解けたらツイートしてね:
- ★const int *my_find(const int *first, const int *last, int value)
first から last の直前までポインタが指すデータを検索し、最初の value のアドレスを返す関数を実装しなさい。
value が無かった場合は last を返しなさい
- int v[] = {1, 2, 3, 4, 5}; に対して my_find(v, v+5, 3) が v+2 を返すことを確認しなさい
- my_find(v, v+5, 9) が v+5 を返すことを確認しなさい
- my_find(v, v, 1) が v を返すことを確認しなさい
- my_find(v, v, 2) が v を返すことを確認しなさい
- テストコード、
解答例(トークン数:40)
- この問題が解けたらツイートしてね:
- ★int my_count(const int *first, const int *last, int value)
first から last の直前までポインタが指すデータを走査し、値が value のデータの個数を返す関数を実装しなさい。
- int v[] = {3, 4, 4, 1, 4}; に対して my_count(v, v+5, 4) が 3 を返すことを確認しなさい
- my_count(v, v+5, 2) が 0 を返すことを確認しなさい
- my_count(v, v+5, 3) が 1 を返すことを確認しなさい
- テストコード、
解答例(トークン数:41)
- この問題が解けたらツイートしてね:
- ★void my_set_zero(int *first, int *last)
first から last の直前までのポインタが指す先に 0 を格納する関数を実装しなさい。first <= last と仮定してよい。
- int v1[] = {1, 2, 3, 4, 5}; my_set_zero(v1, v1+5); を実行し、v1 の中身が全て 0 になっていることを確認しなさい
- int v2[] = {1, 2, 3, 4, 5}; my_set_zero(v2+1, v2+4); を実行し、v2 の中身が {1, 0, 0, 0, 5} になっていることを確認しなさい
- テストコード、
解答例(トークン数:24)
- この問題が解けたらツイートしてね:
- ★void my_set_value(int *first, int *last, int v)
first から last の直前までのポインタが指す先に v を格納する関数を実装しなさい。first <= last と仮定してよい。
- int v1[5] = {0}; my_set_value(v1, v1+5, 1); を実行し、v1 の中身が全て 1 になっていることを確認しなさい
- int v2[5] = {0}; my_set_value(v2+1, v2+4, 1); を実行し、v2 の中身が { 0, 1, 1, 1, 0} になっていることを確認しなさい
- テストコード、
解答例(トークン数:26)
- この問題が解けたらツイートしてね:
- ★int my_accumulate(const int *first, size_t size)
first から size 個のデータを合計した値を返す関数を実装しなさい。
- int v1[] = {1, 2, 3, 4, 5}; に対して my_accumulate(v1, 5) が 15 を返すことを確認しなさい。
- int v2[] = {1, 2, 2, 3, 3}; に対して my_accumulate(v2, 5) が 11 を返すことを確認しなさい。
- int v3[] = {2, 2, 2, 2, 2}; に対して my_accumulate(v3, 3) が 6 を返すことを確認しなさい。
- my_accumulate(v1, 0) が 0 を返すことを確認しなさい
- テストコード、
解答例(トークン数:39)
- この問題が解けたらツイートしてね:
- ★★char my_pop_nth(char *str, int n)
str の n 番目の文字を削除し、削除した文字を返す関数を実装しなさい。n は 0 オリジン(最初の文字を消す場合は n = 0)とします。
n がマイナス、または n が str の文字数以上の場合は、何も削除せず '\0' を返しなさい。
- char v[] = "abcd"; に対して my_pop_nth(v, -1) が '\0' を返し、v が "abcd" であることを確認しなさい。
- 次に、 my_pop_nth(v, 4) が '\0' を返し、v が "abcd" であることを確認しなさい。
- 次に、 my_pop_nth(v, 0) が 'a' を返し、v が "bcd" であることを確認しなさい。
- 次に、 my_pop_nth(v, 1) が 'c' を返し、v が "bd" であることを確認しなさい。
- 次に、 my_pop_nth(v, 1) が 'd' を返し、v が "b" であることを確認しなさい。
- 次に、 my_pop_nth(v, 0) が 'b' を返し、v が "" であることを確認しなさい。
- 次に、 my_pop_nth(v, 0) が '\0' を返し、v が "" であることを確認しなさい。
- テストコード、
解答例(トークン数:63)
- この問題が解けたらツイートしてね:
- ★★void my_push_nth(char *str, int n, char c)
str の n 番目に文字 c を挿入する関数を実装しなさい。n が 0 の場合は c を文字列の先頭に挿入するものとします。
n がマイナスの場合は先頭に挿入しなさい。n が str の文字数より大きい場合は末尾に挿入しなさい。
- char v[10] = ""; my_push_nth(v, 0, 'a'); を実行し、v が "a" になっていることを確認しなさい。
- 続けて my_push_nth(v, 0, 'b'); を実行し、v が "ba" になっていることを確認しなさい。
- 続けて my_push_nth(v, 1, 'c'); を実行し、v が "bca" になっていることを確認しなさい。
- 続けて my_push_nth(v, 3, 'd'); を実行し、v が "bcad" になっていることを確認しなさい。
- 続けて my_push_nth(v, 6, 'e'); を実行し、v が "bcade" になっていることを確認しなさい。
- 続けて my_push_nth(v, -1, 'f'); を実行し、v が "fbcade" になっていることを確認しなさい。
- 続けて my_push_nth(v, 2, 'g'); を実行し、v が "fbgcade" になっていることを確認しなさい。
- テストコード、
解答例(トークン数:76)
- この問題が解けたらツイートしてね:
- ★★void my_trim_left(char *str) 引数 str の先頭の空白類(' ' または '\t')を削除し、その後の文字列を前に移動する関数を実装しなさい
- char v1[] = " abc"; my_trim_left(v1); を実行し、v1 の内容が "abc" になっていることを確認しなさい。
- char v2[] = "\t \t xyzzz"; my_trim_left(v2); を実行し、v2 の内容が "xyzzz" になっていることを確認しなさい。
- char v3[] = "123\tx"; my_trim_left(v3); を実行し、v3 の内容が "123\tx" のままであることを確認しなさい。
- char v4[] = " "; my_trim_left(v4); を実行し、v4 の内容が "" であることを確認しなさい。
- char v5[] = ""; my_trim_left(v5); を実行し、v5 の内容が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:49)
- この問題が解けたらツイートしてね:
- ★★void my_trim_right(char *str) 引数 str 末尾の空白類(' ' または '\t')を削除する関数を実装しなさい
- char v1[] = "abc "; my_trim_right(v1); を実行し、v1 の内容が "abc" になっていることを確認しなさい。
- char v2[] = "xyzzz\t \t"; my_trim_right(v2); を実行し、v2 の内容が "xyzzz" になっていることを確認しなさい。
- char v3[] = " \t123"; my_trim_right(v3); を実行し、v3 の内容が " \t123" のままであることを確認しなさい。
- char v4[] = " "; my_trim_right(v4); を実行し、v4 の内容が "" であることを確認しなさい。
- char v5[] = ""; my_trim_right(v5); を実行し、v5 の内容が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:52)
- この問題が解けたらツイートしてね:
- ★★void my_strcat(char *dst, const char *src)
引数に 文字列 dst, 文字列 src をとり、src を dst 末尾にコピー(src と dst を連結)する関数を実装しなさい。
dst には充分な領域が確保されていると仮定してよい
- char dst[20]; strcpy(dst, "xyz"); my_strcat(dst, "abc123"); を実行し、dst の中身が "xyzabc123" であることを確認しなさい
- strcpy(dst, "xyz"); my_strcat(dst, ""); を実行し、dst の中身が "xyz" であることを確認しなさい
- strcpy(dst, ""); my_strcat(dst, "abcd"); を実行し、dst の中身が "abcd" であることを確認しなさい
- テストコード、
解答例(トークン数:33~36)
- この問題が解けたらツイートしてね:
- ★★void my_strins(char *dst, const char *src)
引数に 文字列 dst, 文字列 src をとり、src を dst の最初に挿入する関数を実装しなさい。dst には充分な容量があると仮定してよい。
- char dst[20]; strcpy(dst, "xyz"); my_strins(dst, "abc123"); を実行し、dst の中身が "abc123xyz" になっていることを確認しなさい
- strcpy(dst, "xyz"); my_strins(dst, ""); を実行し、dst の中身が "xyz" になっていることを確認しなさい
- strcpy(dst, ""); my_strins(dst, "abc123"); を実行し、dst の中身が "abc123" になっていることを確認しなさい
- テストコード、
解答例(トークン数:79)
- この問題が解けたらツイートしてね:
- ★★void my_strrev(char *str) 与えられた文字列の文字順序を反転(例:"abc" → "cba")する関数を実装しなさい。
- char v1[] = "xyz123"; my_strrev(v1); を実行し、v1 の中身が "321zyx" であることを確認しなさい。
- char v2[] = "xyz23"; my_strrev(v2); を実行し、v2 の中身が "32zyx" であることを確認しなさい。
- char v3[] = ""; my_strrev(v3); を実行し、v3 の中身が "" であることを確認しなさい。
- テストコード、
解答例(トークン数:51~64)
- この問題が解けたらツイートしてね:
- ★★void my_str_rot_left(char *str) 与えられた文字列の最初の文字を最後に移動する(例:"12345" → "23451")する関数を実装しなさい。
- char v1[] = "12345"; my_str_rot_left(v1); を実行し、v1 の中身が "23451" になっていることを確認しなさい。
- char v2[] = "abc"; my_str_rot_left(v2); を実行し、v2 の中身が "bca" になっていることを確認しなさい。
- char v3[] = ""; my_str_rot_left(v3); を実行し、v3 の中身が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:66)
- この問題が解けたらツイートしてね:
- ★★void my_str_rot_right(char *str) 与えられた文字列の最後の文字を最初に移動する(例:"12345" → "51234")する関数を実装しなさい。
- char v1[] = "12345"; my_str_rot_right(v1); を実行し、v1 の中身が "51234" になっていることを確認しなさい。
- char v2[] = "abc"; my_str_rot_right(v2); を実行し、v2 の中身が "cab" になっていることを確認しなさい。
- char v3[] = ""; my_str_rot_right(v3); を実行し、v3 の中身が "" のままであることを確認しなさい。
- テストコード、
解答例(トークン数:68)
- この問題が解けたらツイートしてね:
- ★★const char *my_strrchr(const char *str, char c) 引数に 文字列 str、文字 c をとり、文字列中に文字cがあれば、
最後の c へのポインタを返す関数を実装しなさい。文字列中に文字cが無い場合は0を返しなさい。
- my_strrchr("", 'x') が、0 を返すのを確認しなさい
- my_strrchr("abc", 'x') が、0 を返すのを確認しなさい
- my_strrchr("abcabc", 'a') が、"abc" のアドレスを返すのを確認しなさい
- my_strrchr("abcccc", 'c') が、最後の "c" のアドレスを返すのを確認しなさい
- テストコード、
解答例(トークン数:51)
- この問題が解けたらツイートしてね:
- ★★bool my_is_matched(const char *text, const char *pat)
pat の指す文字列の長さが len の時、text の先頭 len 文字が pat に一致すれば true を、そうで無ければ false を返す関数を実装しなさい
- my_is_matched("", "") が true を返すことを確認しなさい
- my_is_matched("abc", "") が true を返すことを確認しなさい
- my_is_matched("abcabc", "abc") が true を返すことを確認しなさい
- my_is_matched("abcxyz", "xyz") が false を返すことを確認しなさい
- my_is_matched("", "xyz") が false を返すことを確認しなさい
- my_is_matched("abbcabc", "abc") が false を返すことを確認しなさい
- テストコード、
解答例(トークン数:36)
- この問題が解けたらツイートしてね:
- ★★void my_toupper(char *str) 引数の文字列中の英小文字('a' ~ 'z')を英大文字('A' ~ 'Z')に変換しなさい。
- char str[] = "123ABCxyz"; my_toupper(str); 実行後に str の内容を表示し、"123ABCXYZ" であることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★void my_toggleCase(char *str) 引数の文字列中の英大文字('A' ~ 'Z')を英小文字('a' ~ 'z')に、小文字を大文字に変換しなさい。
- char str[] = "123ABCxyz"; my_tolower(str); 実行後に str の内容を表示し、"123abcXYZ" であることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★ int my_pop_front(int *first, int *last)
first から last 直前までデータがある時、先頭データを削除し、それ以降のデータを前に移動し、削除した値を返す関数を実装しなさい。
first >= last の場合は、何も処理をせず、-1 を返しなさい。
- int v[] = {1, 2, 3, 4, 5}; my_pop_front(v, v+5); が 1 を返し、v の内容が {2, 3, 4, 5, 5} になっていることを確認しなさい。
- 次に my_pop_front(v+1, v+5); が 3 を返し、v の内容が {2, 4, 5, 5, 5} になっていることを確認しなさい。
- 次に my_pop_front(v+1, v+1); が -1 を返し、v の内容が {2, 4, 5, 5, 5} になっていることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★ void my_push_front(int *first, int *last, int data)
first から last 直前までデータがある時、データをひとつずつ後ろにずらし、データ先頭に data を代入する関数を実装しなさい。
ただし、データを挿入しても、データ領域サイズは増加しない(last の指す先のデータは変化しない)ものとする。
first <= last と仮定してよい。
- int v[] = {1, 2, 3, 4, 5}; my_push_front(v, v+5, 0); を実行し、v の内容が {0, 1, 2, 3, 4} になっていることを確認しなさい。
- 次に my_push_front(v+1, v+5, 6); を実行返し、v の内容が {0, 6, 1, 2, 3} になっていることを確認しなさい。
- 次に my_push_front(v, v+2, 7); を実行返し、v の内容が {7, 0, 1, 2, 3} になっていることを確認しなさい。
- 次に my_push_front(v+1, v+1, 8); を実行返し、v の内容が {7, 0, 1, 2, 3} になっていることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★void my_strmix(char *dst, const char *src1, const char *src2)
src1 の内容と src2 の内容を交互に dst にコピーする関数(例:src1 = "abc" , src2 = "123" ならば、dst = "a1b2c3")を実装しなさい。
src1 と src2 の長さが異なる場合は、余った文字列を単に後ろに追加しなさい(例:src1 = "abc" , src2 = "1" ならば、dst = "a1bc")。
dst には充分な領域が確保されていると仮定してよい
- char dst[10]; my_strmix(dst, "abc", "123"); を実行し、dst の中身が "a1b2c3" であることを確認しなさい。
- my_strmix(dst, "abc", ""); を実行し、dst の中身が "abc" であることを確認しなさい。
- my_strmix(dst, "", "abc"); を実行し、dst の中身が "abc" であることを確認しなさい。
- my_strmix(dst, "", ""); を実行し、dst の中身が "" であることを確認しなさい。
- my_strmix(dst, "abc", "12345"); を実行し、dst の中身が "a1b2c345" であることを確認しなさい。
- my_strmix(dst, "abcd", "12"); を実行し、dst の中身が "a1b2cd" であることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★char *my_strdup(const char *src) 引数に文字列をとり、その文字列分のメモリを確保し、そこに元の文字列をコピーし、
確保したメモリの先頭アドレスを返す関数を実装しなさい
- const char *src = "abc123";
- const char *dst = my_strdup(src);
- 上記を実行し、dst に src の中身がコピーされていることを確認しなさい
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★char *my_strdup2(const char *src) 引数に文字列をとり、
その文字列数*2個分のメモリを確保し、そこに元の文字列を各文字を2文字にしてコピー(例:"abc" → "aabbcc")し、
確保したメモリの先頭アドレスを返す関数を実装しなさい
- const char *src = "abc123";
- const char *dst = my_strdup2(src);
- 上記を実行し、dst に "aabbcc112233" が入っていることを確認しなさい
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★char *my_strleft(const char *src, int n)
メモリを new でアロケートし、そこに src の先頭 n バイトをコピーして返しなさい。
n が src の文字数より多い場合は、src の文字数までをコピーしなさい。
- my_strleft("abcdefg", 3) が "abc" を返すことを確認しなさい。
- my_strleft("xyz", 8) が "xyz" を返すことを確認しなさい。
- my_strleft("", 4) が "" を返すことを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★int my_strcmp(const char *lhs, const char *rhs) 文字列 lhs、rhs の中身の文字を文字コード順比較し、
lhs の指す文字列の方が rhs より小さければ -1 を、lhs と rhs の指す文字列が同じなら 0 を、lhs の指す文字列の方が rhs より大きければ 1 を返す関数を実装しなさい。
- my_strcmp("", "") が 0 を返すのを確認しなさい。
- my_strcmp("XYZ", "XYZ") が 0 を返すのを確認しなさい。
- my_strcmp("abc", "abx") が -1 を返すのを確認しなさい。
- my_strcmp("abx", "abc") が 1 を返すのを確認しなさい。
- my_strcmp("XYZ", "XYZZ") が -1 を返すのを確認しなさい。
- my_strcmp("XYZZ", "XYZ") が 1 を返すのを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★const char *my_strstr(const char *text, const char *pat) 引数に 文字列 text、pat をとり、
文字列 text 中に文字列 pat があれば、その位置へのポインタを返す関数を実装しなさい。文字列中にpatが無い場合は0を返しなさい。
pat が空文字列の場合は常に text を返しなさい
- ヒント:以前作った、my_is_matched() を使うと簡単だよ
- my_strstr("abcabc", "bx") が、0 を返すのを確認しなさい
- my_strstr("abcabc", "bcd") が、0 を返すのを確認しなさい
- my_strstr("abcabc", "c") が、"cabc" のアドレスを返すのを確認しなさい
- my_strstr("abcabc", "abc") が、"abcabc" の先頭アドレスを返すのを確認しなさい
- my_strstr("xbabcabc", "abc") が、"abcabc" のアドレスを返すのを確認しなさい
- my_strstr("ababcabc", "abc") が、"abcabc" のアドレスを返すのを確認しなさい
- my_strstr("abcaabc", "aab") が、"aab" のアドレスを返すのを確認しなさい
- my_strstr("abcaabc", "") が、"abcaabc" の先頭アドレスを返すのを確認しなさい
- my_strstr("", "") が、"" の先頭アドレスを返すのを確認しなさい
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★bool my_ends_with(const char *text, const char *pat)
pat の長さが len の時、text の末尾 len 文字が pat に等しければ true を、そうで無ければ false を返す関数を実装しなさい
- my_ends_with("", "") が true を返すことを確認しなさい
- my_ends_with("abc", "") が true を返すことを確認しなさい
- my_ends_with("xyzabc", "abc") が true を返すことを確認しなさい
- my_ends_with("abcabc", "abc") が true を返すことを確認しなさい
- my_ends_with("abcxyz", "xyz") が true を返すことを確認しなさい
- my_ends_with("abcxyz", "abc") が false を返すことを確認しなさい
- my_ends_with("", "xyz") が false を返すことを確認しなさい
- my_ends_with("abbcabc", "abc") が true を返すことを確認しなさい
- my_ends_with("abc"+1, "abc") が false を返すことを確認しなさい
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★int my_atoi(const char *str)
str の先頭が数字列であれば、それを10進数に変換した値を返す関数を実装しなさい(例:"123" の場合は 123 を返す)。
str の先頭が数字で無い場合は -1 を返しなさい。
- my_atoi("123") が 123 を返すことを確認しなさい。
- my_atoi("98765#") が 98765 を返すことを確認しなさい。
- my_atoi("12.3") が 12 を返すことを確認しなさい。
- my_atoi("-123") が -1 を返すことを確認しなさい。
- my_atoi("a123") が -1 を返すことを確認しなさい。
- my_atoi("") が -1 を返すことを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★void my_strins(char *dst, int ix, const char *src)
引数に 文字列 dst, 文字列 src をとり、src を dst の ix の位置に挿入する関数を実装しなさい。
ix がマイナスだった場合は先頭に src を挿入しなさい。ix が dst の文字数以上の場合は末尾に src を挿入しなさい。
- char dst[20]; strcpy(dst, "xyz"); my_strins(dst, 1, "abc123"); を実行し、dst の中身が "xabc123yz" になっていることを確認しなさい
- strcpy(dst, "xyz"); my_strins(dst, 0, "abc"); を実行し、dst の中身が "abcxyz" になっていることを確認しなさい
- strcpy(dst, "xyz"); my_strins(dst, 3, "abc"); を実行し、dst の中身が "xyzabc" になっていることを確認しなさい
- strcpy(dst, "xyz"); my_strins(dst, 0, ""); を実行し、dst の中身が "xyz" になっていることを確認しなさい
- strcpy(dst, ""); my_strins(dst, 2, "abc123"); を実行し、dst の中身が "abc123" になっていることを確認しなさい
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★void my_strdel(char *str, int ix, int sz)
文字列 str の ix 番目から sz 文字を削除する関数を実装しなさい。
sz が大きい場合、str の文字列を超えて削除しないよう注意しなさい。
ix がマイナスだった場合、sz が0以下だった場合は何も処理をしなくてよい。
ix が str の文字数以上だった場合も何も処理をしなくてよい。
- char v[] = "abcde12345"; my_strdel(v, -1, 2); を実行し、v が "abcde12345" であることを確認しなさい。
- ついで、my_strdel(v, 1, 0); を実行し、v が "abcde12345" であることを確認しなさい。
- ついで、my_strdel(v, 1, 2); を実行し、v が "ade12345" であることを確認しなさい。
- ついで、my_strdel(v, 3, 2); を実行し、v が "ade345" であることを確認しなさい。
- ついで、my_strdel(v, 4, 4); を実行し、v が "ade3" であることを確認しなさい。
- ついで、my_strdel(v, 4, 4); を実行し、v が "ade3" であることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★char *my_strright(const char *src, int n)
メモリを new でアロケートし、そこに src の末尾 n バイトをコピーして返しなさい。
- my_strright("abcdefg", 3) が "efg" を返すことを確認しなさい。
- my_strright("xyz", 8) が "xyz" を返すことを確認しなさい。
- my_strright("", 4) が "" を返すことを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★char *my_strmid(const char *src, int ix, int n)
メモリを new でアロケートし、そこに src の ix 番目から n バイトをコピーして返しなさい。
ix が src 文字数より大きい場合は空文字列を返しなさい。
- my_strmid("abcdefg", 0, 3) が "abc" を返すことを確認しなさい。
- my_strmid("abcdefg", 3, 2) が "de" を返すことを確認しなさい。
- my_strmid("abcdefg", 3, 10) が "defg" を返すことを確認しなさい。
- my_strmid("xyz", 8, 3) が "" を返すことを確認しなさい。
- my_strmid("", 4, 5) が "" を返すことを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★int my_atohex(const char *str)
str の先頭が16進数文字列('0'~'9', 'A'~'F', 'a'~'f')であれば、それを16進数に変換した値を返す関数を実装しなさい(例:"1f" の場合は 31 を返す)。
str の先頭が16進数文字列で無い場合は -1 を返しなさい。
- my_atohex("100") が 256 を返すことを確認しなさい。
- my_atohex("100G") が 256 を返すことを確認しなさい。
- my_atohex("10000") が 65536 を返すことを確認しなさい。
- my_atohex("FF") が 255 を返すことを確認しなさい。
- my_atohex("a0") が 160 を返すことを確認しなさい。
- my_atohex("1f") が 31 を返すことを確認しなさい。
- my_atohex("-1a") が -1 を返すことを確認しなさい。
- my_atohex("") が -1 を返すことを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★void my_memmove(char *dst, const char *src, size_t n)
src から始まる n バイトを dst が指しているところにコピーしなさい。
※ 通常の文字列の様に、データの途中にヌル文字があっても、そこで終了とみなさなくてよい。
n が 0 の場合は何もしなくてよい。
dst と src の領域が重なっていても正しく動作するようにしなさい。
- char v[] = "1234567"; my_memmove(v, v+1, 3); を実行し、v が "2344567" になることを確認しなさい。
- 続けて、my_memmove(v+1, v, 4); を実行し、v が "2234467" になることを確認しなさい。
- 続けて、my_memmove(v, v, 4); を実行し、v が "2234467" のままであることを確認しなさい。
- 続けて、my_memmove(v, v+2, 0); を実行し、v が "2234467" のままであることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
- ★★★★★void my_replace(char *buf, const char *before, const char *after)
文字列 buf 中の文字列 before を全て after に置換する関数を実装しなさい。buf には充分な容量があると仮定して良い。
- char buf[20] = "abcdbcde"; に対して my_strreplace(buf, "bc", "X"); を実行し、buf の内容が "aXdXde" になっていることを確認しなさい。
- strcpy(buf, "abcdbcde"); my_strreplace(buf, "bc", "XYZ"); を実行し、buf の内容が "aXYZdXYZde" になっていることを確認しなさい。
- strcpy(buf, "abcdbcde"); my_strreplace(buf, "d", ""); を実行し、buf の内容が "abcbce" になっていることを確認しなさい。
- テストコード、
解答例
- この問題が解けたらツイートしてね:
前:
|上:C/C++ ポインタ入門
|次:
Copyright (C) 2013 by N.Tsuda, All Rights Reserved.