アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (6件)

atoi を自作するには


http://oshiete1.goo.ne.jp/qa643063.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/11 22:31

引数として渡す書式はどうなっていますか?


変換に失敗した場合の仕様も補足してください。

この回答への補足

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

補足日時:2009/06/11 22:28
    • good
    • 0

#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>と基礎的な学習量のみでコーディングできる範囲なんだと思います。
回答ありがとうございます!

補足日時:2009/06/11 22:54
    • good
    • 0

> まだ多様なことは習ってませんし



条件をいろいろ後出しされても困ります。

> <stdio.h>と基礎的な学習量のみでコーディングできる範囲なんだと思います。

基礎的な学習量をこなしたのにコーディングできないから質問しているのではないのですか?

この回答への補足

確かにそこは言ってませんでしたが、質問内容から低レベルな質問かなと思ってたんでつい。。
言っておくべきでしたね。すいません↓

いや、僕がその学習をこなせてないからなんですよ↓
変換の仕方が考え付かない感じですね。。

補足日時:2009/06/12 23:28
    • good
    • 0

> いや、僕がその学習をこなせてないからなんですよ↓



では、学習をこなしてから再質問してください。
そうでないと、回答しても内容を理解できないと思います。

この回答への補足

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

補足日時:2009/06/18 18:34
    • good
    • 0

#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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/25 23:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!