至急!!C言語の課題です。
至急!!C言語の課題です。 C言語の標準ライブラリ関数には、文字列で表された数値を整数型に変換する関数としてstdlib.hで定義されているatoiがある。下記のプログラムはこの関数を用いたものである。これと同じ動作を行う関数my_atoi( )を作成し、このプログラムをその自分が作成した関数を用いるように書き換えよ。ただし、文字列に含まれる文字は0から9までの数字か負の符号を表す-の記号のみであるとして良い。課題の提出はプログラム全体のソースコードを提出すること。 (ヒント:文字列を配列として扱って1文字ずつ処理する。文字の'0'と数字の0は異なるが、例えば文字の'7'は'7' - '0'を計算すれば数字の7となる。配列の要素をインデックス順に数字に変換してその前に変換された数字に10を掛けてから加える操作を行っていくと整数に変換できる。) #include <stdio.h> #include <stdlib.h> int main(void) { char str[16]; printf("整数値を入力:"); scanf("%s", str); printf("文字列として表示:%s\n", str); printf("整数として表示:%d\n", atoi(str)); return (0); }
ベストアンサー
「配列の要素をインデックス順に数字に変換して」とヒントにありますので、この課題内容はポインタを勉強する前の段階を想定しているような気がしました。 以下は、ポインタの知識が充分でなくても理解可能な形のプログラム例です。 //プログラム例1 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int char_to_int(char ch) { if ('0' <= ch && ch <= '9') { //【ヒントより】“文字の'0'と数字の0は異なるが、例えば文字の'7'は'7' - '0'を計算すれば数字の7となる。” return ch - '0'; } else { fputs("数字以外の文字が含まれていました。\n", stderr); exit(EXIT_FAILURE); } } int my_atoi(const char* str) { int sign; //符号 int i; //インデックス //【ヒントより】“文字列を配列として扱って1文字ずつ処理する。” if (str[0] == '-') { //負である sign = -1; i = 1;//「-」記号1個を読み飛ばすためにインデックスを 1 とする } else { //非負である sign = 1; i = 0; } //先頭の数字を処理 int n = char_to_int(str[i]); ++i;//次の文字に勧める //後続の数字群を処理 for (;;) { if (str[i] == '\0') return sign * n;//負であれば sign は -1 となっているため、この掛け算によって戻り値はマイナスの値となる else { //【ヒントより】“配列の要素をインデックス順に数字に変換してその前に変換された数字に10を掛けてから加える操作を行っていくと整数に変換できる。” n = 10 * n + char_to_int(str[i]); ++i;//次の文字に進める } } } int main(void) { char str[16]; printf("整数値を入力:"); scanf("%s", str); printf("文字列として表示:%s\n", str); printf("整数として表示:%d\n", my_atoi(str)); return (0); } 《解説》 まず、str[0] がマイナス記号かどうかを見て sign の値と i の初期値を決めます。 先頭の数字から整数値を n に取得し、後に数字が続いていれば n を 10 倍しながらそれらを足し合わせていきます。 文字列の終わりに達したら(つまり、str[i] が '\0' になったら)sign と n を掛けて返します。 ~参考~ 別の例です。ポインタの知識(そしてその他の関連知識)を前提とした場合、my_atoi 関数はかなり簡単なものとなります。なお、以下の main 関数では scanf が失敗した場合への考慮も含めてみました。 //プログラム例2 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int char_to_int(char ch) { if ('0' <= ch && ch <= '9') return ch - '0'; else { fputs("数字以外の文字が含まれていました。\n", stderr); exit(EXIT_FAILURE); } } int my_atoi(const char* str) { if (*str == '-') return -my_atoi(str + 1); else { int n = char_to_int(*str++); while (*str) n = 10 * n + char_to_int(*str++); return n; } } int main() { char str[16]; printf("整数値を入力:"); if (scanf("%15s", str) == 1) { printf("文字列として表示:%s\n", str); printf("整数として表示:%d\n", my_atoi(str)); return EXIT_SUCCESS; } else { fputs("文字列が正しく入力されませんでした。\n", stderr); return EXIT_FAILURE; } }
1人がナイス!しています
質問者からのお礼コメント
丁寧にありがとうございます。大変助かりました。
お礼日時:1/17 3:47