C言語関係掲示板

過去ログ

No885 int型で入力した整数をchar型の文字列に変換する関数

[戻る] [ホームページ]
No.297

助けてください!!
投稿者---ダエダエ(2003/07/25 17:57:12)


この春から高校に入学し、C言語を勉強し始めたのですが、今回課題が出たのですが、まだ習っていないところなので、自己学習だけでは、もうお手上げ状態です。どうか教えてください。
課題:int型で入力した整数をchar型の文字列に変換する関数「itoa」を作成

No.298

Re:助けてください!!
投稿者---物見遊山(2003/07/25 18:35:12)


>課題:int型で入力した整数をchar型の文字列に変換する関数「itoa」を作成

まじめにコツコツ作る方法と
10行程度で簡単に作る方法の
2つあるんだけど。
他に条件とか制限とかないの?

No.300

Re:助けてください!!
投稿者---ダエダエ(2003/07/25 20:33:01)


>>課題:int型で入力した整数をchar型の文字列に変換する関数「itoa」を作成
>
>まじめにコツコツ作る方法と
>10行程度で簡単に作る方法の
>2つあるんだけど。
>他に条件とか制限とかないの?
まじめに作るほうを教えてください。条件は他にはありません。よろしくお願いします。

No.303

Re:助けてください!!
投稿者---あかま(2003/07/25 21:30:08)


プログラムの方針としては、文字コードの関係で、数字1桁+'0'(文字列の0)で文字の数字に変換できます。
1+'0'→'1'
5+'0'→'5'
で、これを上位桁から一つづつ行って、char配列に格納していけばいいわけです。

まじめでないほうですが。

#include <stdio.h>

main(){
	char str[50];
	int in,i,j;
	
	scanf("%d",&in);
	for(i = 1;i*10 < in;i *=10);
	for(j = 0;0 < i;i /=10,j++){
		str[j] = in/i+'0';
		in %= i;
	}
	str[j] = '\0';
	printf("%s",str);
}


No.306

Re:助けてください!!
投稿者---ダエダエ(2003/07/25 21:57:19)


あかまさんどうもありがとうございます。初心者の私にとってはいろんなプログラムを知ることも勉強のうちです。今回は本当にありがとうございました。

No.304

Re:助けてください!!
投稿者---nop(2003/07/25 21:36:15)


>まじめに作るほうを教えてください。条件は他にはありません。よろしくお願いします。

オレならこんな感じかな。
# 実務なら「sparintf()」使うけどね。(^^;)


#include    <stdio.h>

/* ************************************************************
    関数名【 itoa() 】
        数値文字列変換処理関数
    処理概要
        引数で渡された整数値を文字列に変換する
    引数
        1) val : 変換する値
        2) str : 変換した文字列を格納するエリアのポインタ
    戻り値
        変換した文字列の先頭ポインタ
************************************************************ */
char *itoa( int val, char *str )
{
    /* ***** 内部変数定義 ***** */
    char    *ret = str;
    int     i;

    if( val<0 )
    {
        /* ***** 符号を設定 ***** */
        *str++ = '-';

        /* ***** 絶対値算出 ***** */
        val *= -1;
    }
    while( val )    /* 変換する桁が無くなるまでループ */
    {
        /* ***** 文字列の末尾を見つける ***** */
        for( i=0; str[i]; i++ );

        for( ; i>=0; i-- )    /* 末尾から文字列の先頭までループ */
        {
            /* ***** 文字を一文字後退 ***** */
            str[i+1] = str[i];
        }
        /* ***** 一桁を変換する ***** */
        *str = "0123456789"[val%10];
        val /= 10;
    }
    return ret;
}

int main( void )
{
    /* ***** 変数定義 ***** */
    char    buf[256] = {'\0'};
    int     val = 1234;

    /* ***** 変換し表示 ***** */
    printf( "%s\n", itoa(val,buf) );

    return 0;
}


No.307

Re:助けてください!!
投稿者---ダエダエ(2003/07/25 22:00:12)


nopさんどうもありがとうございます。初心者の私にとってはまだ簡単には理解できませんが、夏休み中にこつこつ勉強して、理解したいと思います。今回はどうもありがとうございました。

No.308

Re:助けてください!!
投稿者---ダエダエ(2003/07/25 22:07:28)


何度も申し訳ございません。scanfで取得した値を文字列に変換したいのですが、このプログラムの場合scanfをどこにくわえたらよいのでしょうか?

No.311

Re:助けてください!!
投稿者---nop(2003/07/25 23:24:59)


>何度も申し訳ございません。scanfで取得した値を文字列に変換したいのですが、このプログラムの場合scanfをどこにくわえたらよいのでしょうか?

main() の printf() の前。

No.312

訂正
投稿者---nop(2003/07/25 23:29:19)


重大なコードが抜けていたため、訂正します。(-_-;)


/* ************************************************************
    関数名【 itoa() 】
        数値文字列変換処理関数
    処理概要
        引数で渡された整数値を文字列に変換する
    引数
        1) val : 変換する値
        2) str : 変換した文字列を格納するエリアのポインタ
    戻り値
        変換した文字列の先頭ポインタ
************************************************************ */
char *itoa( int val, char *str )
{
    /* ***** 内部変数定義 ***** */
    char    *ret = str;
    int     i;

    if( val<0 )
    {
        /* ***** 符号を設定 ***** */
        *str++ = '-';

        /* ***** 絶対値算出 ***** */
        val *= -1;
    }
    /* ***** ターミネート文字設定 ***** */
    *str = '\0';

    while( val )    /* 変換する桁が無くなるまでループ */
    {
        /* ***** 文字列の末尾を見つける ***** */
        for( i=0; str[i]; i++ );

        for( ; i>=0; i-- )    /* 末尾から文字列の先頭までループ */
        {
            /* ***** 文字を一文字後退 ***** */
            str[i+1] = str[i];
        }
        /* ***** 一桁を変換する ***** */
        *str = "0123456789"[val%10];
        val /= 10;
    }
    return ret;
}


No.313

Re:訂正
投稿者---あかま(2003/07/26 10:00:47)


>*str = "0123456789"[val%10];
すばらしぃ。
考えてみればたしかにできますな、この書き方。
関数の上のほうに宣言しとくより見やすい。

No.314

Re:訂正
投稿者---ダエダエ(2003/07/26 10:21:37)


scanfをいれて数値を入力することが出来るようになったのですが、変換された文字が出力されずに入力した数値がそのまま出力されるのですが、どこか違うでしょうか
char *itoa( int val, char *str )
{
/* ***** 内部変数定義 ***** */
char *ret = str;
int i;

if( val<0 )
{
/* ***** 符号を設定 ***** */
*str++ = '-';

/* ***** 絶対値算出 ***** */
val *= -1;
}
/* ***** ターミネート文字設定 ***** */
*str = '\0';

while( val ) /* 変換する桁が無くなるまでループ */
{
/* ***** 文字列の末尾を見つける ***** */
for( i=0; str[i]; i++ );

for( ; i>=0; i-- ) /* 末尾から文字列の先頭までループ */
{
/* ***** 文字を一文字後退 ***** */
str[i+1] = str[i];
}
/* ***** 一桁を変換する ***** */
*str = "0123456789"[val%10];
val /= 10;
}
return ret;
}
int main( void )
{
/* ***** 変数定義 ***** */
char buf[256] = {'\0'};
int val = 1234;
printf("数値を入力してください->");
scanf("%d",&val);
/* ***** 変換し表示 ***** */
printf( "%s\n", itoa(val,buf) );

return 0;
}

No.315

Re:訂正
投稿者---あかま(2003/07/26 17:51:43)


ソースはHTML変換ツールがありますので、それを使って貼り付けてください。

>変換された文字が出力されずに入力した数値がそのまま出力されるのですが、どこか違うでしょうか
数字をそのまま出力しても、文字列に変換して出力しても見た目は変わらないでしょう。
printfで出力しているのは%sで文字列ですよね?
ですから間違いなく変換されて文字列が出力されています。


No.322

ありがとうございました。
投稿者---ダエダエ(2003/07/26 21:29:31)


>>変換された文字が出力されずに入力した数値がそのまま出力されるのですが、どこか違うでしょうか
>数字をそのまま出力しても、文字列に変換して出力しても見た目は変わらないでしょう。
>printfで出力しているのは%sで文字列ですよね?
>ですから間違いなく変換されて文字列が出力されています。

適切なご意見ありがとうございました。まだまだ勉強することがたくさんありますね。もっと勉強したいと思います。

No.316

Re:助けてください!!
投稿者---かずま(2003/07/26 18:18:04)


> まじめに作るほうを教えてください。条件は他にはありません。よろしくお願いします。

その前に、「掲示板ご利用上の注意」にしたがって、まじめに投稿
してください。
題名が不適切なだけでなく、不要な全文引用のせいで、どこ
にあなたのコメントがあるのか非常に分かりにくくなっています。

さて、まじめに作るとこうでしょう。
char *itoa(int v, char *s)
{
    char t[12];
    int i = 0, j = 0;
    unsigned int u = v;

    if (v < 0) {
        u = -v;
        s[i++] = '-';
    }
    do {
        t[j++] = u % 10 + '0';
        u /= 10;
    } while (u != 0);
    do {
        s[i++] = t[--j];
    } while (j != 0);
    s[i] = 0;
    return s;
}

ふまじめに作るとこうなりました。
char *x(unsigned int u, char *s)
{
    return (u > 10) && (s = x(u / 10, s)), *s++ = u % 10 + '0', s;
}
    
char *itoa(int v, char *s)
{
    return (v < 0) ? (*s = '-', *x(-v, s+1) = 0) : (*x(v, s) = 0), s;
}

-2147483648 も正しく処理できます。

No.323

Re:助けてください!!
投稿者---かずま(2003/07/26 22:00:37)


>    return (u > 10) && (s = x(u / 10, s)), *s++ = u % 10 + '0', s;
ふまじめに書いたから、誰も指摘してくれないのかな。

(u > 10) は、(u >= 10) または (u > 9) の間違いです。

No.324

Re:助けてください!!
投稿者---ダエダエ(2003/07/26 22:19:40)


かずまさんどうもありがとうございます。初心者の私にとってはいろんなプログラムを知ることも勉強のうちです。今回は本当にありがとうございました。


No.329

Re:助けてください!!
投稿者---nop(2003/07/28 11:49:44)


>ふまじめに作るとこうなりました。
>(ソース略)
>-2147483648 も正しく処理できます。

不真面目に作るとこうでは?(笑)

char    itoa( int val, char *str )
{
    sprintf( str, "%d", val );
    return str;
}