- ベストアンサー
C言語 プログラミング 関数
文字列を引数とし、それをint型の整数に変換し戻り値として返す関数を作りたいんですが、どのように作ったらいいでしょうか? お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2 補足 >他の文字で構成された文字列の場合は終了させたいです。 他の文字が「現れた時点」で関数を終了、としてみました。 ソースの例では、「小数点」で処理を終了し、それまでの数を戻り値としています。 #3 補足 >基礎的な学習量のみでコーディングできる範囲なんだと思います。 ・ for 文のインクリメントで次の文字を処理 ・「ポインタ」のインクリメントで次の文字を処理(未習?) 2つ作ってみました。 #4 補足 >変換の仕方が考え付かない感じですね。。 876 = 8 * 100 + 7 * 10 + 6 としたいところですが、いつ「他の文字」が現れるか不明ですので、まだ数字が続く、と判った時点で * 10 (◆)しています。 まず、0 + 8 次が、7 と判明した時点で、8 * 10。そして 80 + 7 次に、6 と判明した時点で、87 * 10。そして 870 + 6 次に、「他の文字」なので、それまでの数 876 で終了。 http://e-words.jp/p/r-ascii.html #include <stdio.h> int toPlusIntegerP( char *cStr ) { int iRet = 0, iChk; while( *cStr ){ iChk = *cStr++ - '0'; // 文字から数値へ if( iChk < 0 ) return( iRet ); if( iChk > 9 ) return( iRet ); iRet *= 10; // 桁上げ ◆ iRet += iChk; } return( iRet ); } int toPlusIntegerF( char cStr[] ) { int iRet = 0, i, i1; for( i = 0; ( cStr[ i ] >= '0' ) && ( cStr[ i ] <= '9' ); i++ ){ i1 = cStr[ i ] - '0'; // 文字から数値へ iRet *= 10; // 桁上げ ◆ iRet += i1; } return( iRet ); } int main( void ) { char cStr[ 8 ] = "876.543"; printf( "%d\n", toPlusIntegerP( cStr ) ); printf( "%d\n", toPlusIntegerF( cStr ) ); return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (5)
- jacta
- ベストアンサー率26% (845/3158)
> いや、僕がその学習をこなせてないからなんですよ↓ では、学習をこなしてから再質問してください。 そうでないと、回答しても内容を理解できないと思います。
補足
今は理解は必要でなく簡単な形式で書かれた回答がほしいですよ。。 正味それが終わって理解するのも可能だと思うんで、回答があるに越したことはないですね。 だからあっても全く問題ないですよ! ちょっと厚かましいかもですが。。
- jacta
- ベストアンサー率26% (845/3158)
> まだ多様なことは習ってませんし 条件をいろいろ後出しされても困ります。 > <stdio.h>と基礎的な学習量のみでコーディングできる範囲なんだと思います。 基礎的な学習量をこなしたのにコーディングできないから質問しているのではないのですか?
補足
確かにそこは言ってませんでしたが、質問内容から低レベルな質問かなと思ってたんでつい。。 言っておくべきでしたね。すいません↓ いや、僕がその学習をこなせてないからなんですよ↓ 変換の仕方が考え付かない感じですね。。
- jacta
- ベストアンサー率26% (845/3158)
#include <string.h> #include <stdlib.h> #include <errno.h> #include <limits.h> int string_to_integer(const char *s) { if (s == NULL || s[0] == '\0') abort(); if (s[strspn(s, "0123456789")] != '\0') abort(); errno = 0; long result = strtol(s, NULL, 10); if (errno != 0 || result < INT_MIN || INT_MAX < result) abort(); return (int)result; } 仕様が不明な部分は勝手に解釈しました。
補足
ちょっとこれは理解不能ですね。。w まだ多様なことは習ってませんし<stdio.h>と基礎的な学習量のみでコーディングできる範囲なんだと思います。 回答ありがとうございます!
- jacta
- ベストアンサー率26% (845/3158)
引数として渡す書式はどうなっていますか? 変換に失敗した場合の仕様も補足してください。
補足
すいません書き忘れてました! 文字列定数も数字のみで構成されたものを対象とします。 他の文字で構成された文字列の場合は終了させたいです。
- bluecampus
- ベストアンサー率66% (138/209)
atoi を自作するには http://oshiete1.goo.ne.jp/qa643063.html
お礼
ありがとうございます! でもよくわかんなかったです汗
お礼
遅くなりました! わかりやすく説明してくれてありがとうございました。 きちんとプログラムかけました。