• ベストアンサー

C言語 プログラミング 関数

文字列を引数とし、それをint型の整数に変換し戻り値として返す関数を作りたいんですが、どのように作ったらいいでしょうか? お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

tomato1414
質問者

お礼

遅くなりました! わかりやすく説明してくれてありがとうございました。 きちんとプログラムかけました。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> いや、僕がその学習をこなせてないからなんですよ↓ では、学習をこなしてから再質問してください。 そうでないと、回答しても内容を理解できないと思います。

tomato1414
質問者

補足

今は理解は必要でなく簡単な形式で書かれた回答がほしいですよ。。 正味それが終わって理解するのも可能だと思うんで、回答があるに越したことはないですね。 だからあっても全く問題ないですよ! ちょっと厚かましいかもですが。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> まだ多様なことは習ってませんし 条件をいろいろ後出しされても困ります。 > <stdio.h>と基礎的な学習量のみでコーディングできる範囲なんだと思います。 基礎的な学習量をこなしたのにコーディングできないから質問しているのではないのですか?

tomato1414
質問者

補足

確かにそこは言ってませんでしたが、質問内容から低レベルな質問かなと思ってたんでつい。。 言っておくべきでしたね。すいません↓ いや、僕がその学習をこなせてないからなんですよ↓ 変換の仕方が考え付かない感じですね。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#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; } 仕様が不明な部分は勝手に解釈しました。

tomato1414
質問者

補足

ちょっとこれは理解不能ですね。。w まだ多様なことは習ってませんし<stdio.h>と基礎的な学習量のみでコーディングできる範囲なんだと思います。 回答ありがとうございます!

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

引数として渡す書式はどうなっていますか? 変換に失敗した場合の仕様も補足してください。

tomato1414
質問者

補足

すいません書き忘れてました! 文字列定数も数字のみで構成されたものを対象とします。 他の文字で構成された文字列の場合は終了させたいです。

回答No.1

atoi を自作するには http://oshiete1.goo.ne.jp/qa643063.html

tomato1414
質問者

お礼

ありがとうございます! でもよくわかんなかったです汗

関連するQ&A

  • C言語によるガンマ関数の記述

    今、C言語を用いてガンマ関数を計算する方法を模索中でです。 理想的にはガンマ関数の引数に数値を入れたら戻り値を返すというのがいいのですがそうもうまくいかないと思います。 そこで以下のような形で整数の場合と非整数の場合で作ることを考えています。しかし、引数が整数のときはわかるのですが、非整数のときがわかりません。どうしたらよいでしょうか。 以下に関数の概要を掲載します。 ==========関数の概要=========== 関数名:Gamma(x) 戻り値:double 引数:x[double] 1)引数が0より大きい整数(1,2,3...)のとき   階乗の自己回帰文を使用して計算 2)引数が0より大きい非整数の場合 ==========▲ここまで==========

  • C言語 exitで終了した関数の戻り値

    引数が負の整数であればエラーを表示し終了、0以上の整数であればそのまま戻り値とする関数 int example(int a) { if( a < 0 ) { printf("Error!\n");   exit(1); } return(a); } があったとします。 ここでたとえば  int s1,s2; に対して、 s1 = example(3); とすれば、 s1 = 3 となりますが、 s2 = example(-5); とすれば、 s2 には何が代入されているのでしょうか? 例に書いた関数はしょーもないものですが、 もう少し難しい関数を使って変数に値を入れて、その値で後でfor文などを使って仕分けていくようにしたいのですが、エラー時に代入されるものがわからなくて困っています。 エラー時のみに目印となる値、たとえば -1 などを戻り値とすることはできません。 おねがいします。

  • c言語の関数定義について

    次の関数定義を考える. int f(int x) {if (x > 0) {return x * f(x-1);} else {return 1;} } この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ.ただし,オーバーフロー(overflow) については考慮しなくてよい. ”この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語のisdigit関数を使った問題です。バッファ読み捨てがよく解りません。

    5文字以内の入力文字を数字のみか文字が含まれているかで表示を変えたいです。main関数内では判定結果のみを表示して、文字列への文字の格納にはfgetsとgetcharを使い、副関数の引数はポインタ型のものを使い、判断は副関数内で行いその戻り値でmain関数で表示を分岐させます。副関数でwhileとisdigit関数の組み合わせ方と、戻り値の選択のやり方が解りません。どなたか詳しい方ぜひ教えていただければと思います。

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語

    毎度毎度お世話になります<(_ _)> 今回は関数のところで躓いています(;´Д`) 問題は二つなんですけど、 「二つの整数変数の引数の和を計算して結果を戻す関数plusを作成し、 それを利用して以下の実行結果になるようにしなさい。」 ■ 実行例 ■ Input two integer numbers 4 5 4+5=9 (数字は1例です) 「会場を求める関数factとべき乗を求める関数powintを利用して、 n!/xのn乗を求める関数pow_factを作成しなさい。 ただし、pow_fact関数は因数に整数値をとるが、戻り値は実数になることに注意しなさい。」 ■ 実行例 ■ Input number 5    1    1.000000000    2    0.500000000    3    0.222222224    4    0.093750000    5    0.038400002 ( 数字は1例です ) といった感じです。 最初の問題は int plus( int a, int b){ int y = 1; ココがわからない return y; } この先もわからない といった感じです。 二問目に関してはさっぱりわかってません(;´Д`) 回答、アドバイスなど沢山の回答お待ちしています。 ちなみにLinuxのGNOME端末をつかっています。

  • C言語(2)

    (1)数値を整数化(切り捨て)する関数を教えてください。 (2) int型の数値をかけ算、わり算したいのですが、 int a; float b; [aに数値を入れる戻り値int]; b=a; [かけ算やわり算] a=b; これでできますか? 出来ないなら方法を教えてください。

  • C言語 配列・関数の問題

    下記の問題が解けなくて困っております。 for文をつかった解法をお願いしたいです。 n個の要素からなる整数の配列a[ ]の中から2番目に大きな値を求め、それを戻り値とする関数maxsecを作成しなさい。 int maxsec(int n , int a[ ]) { 宜しくお願いします。

  • c言語プログラミングについて

    回答お願いします!! 3つの整数値をキーボードから入力し、その平均値を求めるものを出力しなさい。 ただし、3つの整数値から平均値を戻り値として返す。 関数double average(intx,inty,intz)を作成し、これを使って平均値の値を出力すること 平均値は小数第二位まで出力せよ 上記の問題がどうしても分かりません!

専門家に質問してみよう