int型 を charの配列型 にしたいんだけど、
そういう関数がなさそうだから、そういう動作を
するものを作ってみました。
#include <iostream.h>
main(){
int n = 123;
char c[4];
for (int i=4-2; i>=0; i--) {
c[i] = n%10+48;
n/=10;
}
c[4-1] = '\0';
cout << c;
}
char c[4]; の部分が気に入りません。
4 という数字を int n = 123; の桁数の 3+1 で
やりたいんだけど、配列の添え字は定数でないと
いけないらしく、それはできませんでした。
malloc( ) というものを使ったことがないんだけど
配列の宣言後に malloc() とかで配列のメモリを
変える方法があったら教えてください。
全体的に、int型 を charの配列型 にする考え方で
もっとよい方法とか、それをする関数があれば
教えてください。
vecter( ) を使った場合では、出力する時に、
cout << hairetu[0];
cout << hairetu[1];
cout << hairetu[2];
というふうにしないとだめみたいで、普通の配列と違って
cout << hairetu;
で出力できなかったから vecter( ) 以外の方法を知りたいです。
No.4ベストアンサー
- 回答日時:
こんにちは。
sprintf()を使用すると言う点ではNo.3の方の回答で良いと思いますが、
c = (char *)malloc(strlen(n));
malloc()の引数であるstrlen(n)の部分はまずいですね。
(No.3の方申し訳ありません。。。。)
strlen()の引数はchar *であるため上記の例では意図しないアドレスを参照してしまいます。
当方の環境ではコアダンプしました。当然のことですが。
ご質問から、変換後のバイト数をきっちりと確保されたいようですが、これは一発では難しいと思います。
仮にそうされるのであれば、以下の様にすれば可能だと思います。(No.3の方のソースを流用させて頂きます)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int n = 123;
char *c;
char *tmp;
tmp = (char *)malloc(20); ←適当にメモリを確保する
sprintf(tmp,"%d",n);
c = (char *)malloc(strlen(tmp)+1);
strcpy(c, tmp);
printf ("変換後=%s\n", c);
}
と言った感じでしょうか。何だか意味なさげなプログラムになってしまいましたが。すみません。やはり、桁数は地道に計算で出すしかないのかな?っと思っております。
ありがとうございます。
No.3 の kenji_ さんの
c = (char *)malloc(strlen(n));
は間違っているは、見てすぐにわかったけど、
それを見て、123 の桁数を使うという意味は伝わりました。
でも、
c = (char *)malloc(strlen(n+1));
でないとおかしいかなと思っていたら、
pikacchuさんは
strlen(tmp)+1
としていたから、やっぱり、123 の3桁に1を足した4が
malloc( ) の引数ですよね。
No.6
- 回答日時:
c++ の方が簡単ですよ。
c++ には、文字列を扱う stream があります。まずは、実例を。
#include <strstream.h>
#include <iostream.h>
int main()
{
strstream s;
int i = 12345;
s << i;
cout << s.str() << endl;
return 0;
}
strstream は、内部バッファ(メモリ)に情報を貯える stream です。
貯えた情報を指す char のポインタを取得するには str() メソッドを使います。
これは、strstream が抱えている領域を指しているだけですから、strstream の
インスタンスが無くなると不当な領域を指してしまいます。変換した結果を
別途、保存しておきたいのであれば、以下のような感じになります。
char* data;
data = new char[ strlen(s.str()) + 1 ];
strcpy(data, s.str());
もしくは、
char* data;
data = strdup(s.str());
両方とも、領域を割当てていますから、別途 delete や free() が必要になります。
int を char * に変換する方法で、
sprintf( ) 以外にも便利なものがあったんですねー。
int main( ){
strstream s;
int n;
cout << "数字入力"; // 123
cin >> n;
s << n;
cout << s.str( ) << '\n';
char *doruzero = "";
strcat(s.str( ), doruzero); // s.str( ) がchar型ならエラーにならんはず
}
結果は
数字入力123
123
できました。
コンパイル後にメモリ確保も、malloc( ) 以外に
new が使えるのは知りませんでした。
ここで教えてもらって、初めて new というものを
使ってみました。
main( ){
int n;
cout << "数字の桁数入力"; // 3
cin >> n;
char *c;
c = new char[n+1];
printf("%#x\n", *(c+3));
cout << sizeof(c);
}
結果は
数字の桁数入力3
0x0
4
できました。
delete や free( ) での解放については
後で調べてみます。
ありがとうございました。
No.5
- 回答日時:
kenji_さんの回答に少し補足を。
> c = (char *)malloc(strlen(n));
strlen(n) だとちょっとおかしいようで。
int i;
for( i = 0; n; i++ ) n /= 10;
c = (char*)malloc( i + 1 ); // c = new char[ i + 1 ];
> sprintf(c,"%d",n);
> printf ("変換後=%s\n", c);
ついでにこれも欲しいです。
free( c ); // delete[] c;
hwangさんの回答にも少し補足を。
> char wk[21]; /* work area */
>
> sprintf (wk, "%d", i_data);
> if (strlen (wk) > 16 ) { /* 通常は16桁で十分変換エラー */
> return (-1);
sprintfが失敗した場合, 不定なwkに対してstrlenをしてしまうことになり具合が
良くないようです。(下手すると例外)
int len = sprintf (wk, "%d", i_data);
if (len > 16 || len < 1) { /* 通常は16桁で十分変換エラー */
といった感じで、失敗を見る場合、戻り値で見た方がよさそうですね。
ゆーても sprintf の成否って普段見ないんでちょっと迷いました。
今回は多分以降の memcpy に備えてだとは思うんですが、sprintf での失敗でしか strlen(wk) > 16 はありえないんで、
関数成否判定のイメージを書いてみました。
ほな、横から失礼しました。
No.3
- 回答日時:
sprintf()を使えばint型からchar型に変換可能です。
上プログラムをこれで書き換えると
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int n = 123;
char *c;
c = (char *)malloc(strlen(n));
sprintf(c,"%d",n);
printf ("変換後=%s\n", c);
}
こんな感じになります。
C++のようなのでmallocでなく
new演算子を使ったほうが簡単かも?
char *c;
c = (char *)malloc(4);
sprintf(c,"%d",n);
でできました。
malloc( ) の使い方が分かりました。
malloc( ) の引数の 4 は、while(n/10) を
使って得ることができました。
sprintf( ) で int を char * に変換する
こともできました。
ありがとうございます。
No.2
- 回答日時:
コンパイラにより、itoaがないかもしれない
下記の方法は出来ます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Int_To_Char (int, char *);
int
main( argc,argv )
int argc;
char *argv[];
{
int ret = 0;
char c[20];
int i = 123;
memset (c, NULL, sizeof (c)); /* 初期値の初期化 */
ret = Int_To_Char (i, c);
printf ("変換後 = [%s]\n", c);
}
/*
*Int_To_Char ():文字列型変換(Int型→文字列)
*
*/
int
Int_To_Char ( i_data, o_buf )
int i_data;/* 変換元データ*/
char*o_buf;/* 変換先文字列*/
{
charwk[21];/* work area*/
sprintf (wk, "%d", i_data);
if (strlen (wk) > 16 ) { /* 通常は16桁で十分変換エラー */
return (-1);
}
memcpy (o_buf, wk, strlen(wk));
return ( 0 );
}
memset( ) も memcpy( ) も知らなかったから
まだ理解できていないけど、こんなふうに
説明よりもソースメインに書いてくれる解答は
大好きです。
ありがとうございます。
No.1
- 回答日時:
>atoi( ) の反対をやりたい
ANSI に、itoa(引数注意)があったと思いますが、だめなんでしょうか?
ありがとうございます。
itoa( ) は知りませんでした。
itoa( ) は bcc32 で使えて、考え中です。
itoa( ) を使わない方法も考えたいです。
#include <iostream.h>
main( ){
int n;
cout << "数字入力"; // 123
cin << n;
char c[4];
itoa(c,n,10); // 123を10進として解釈し、char型の配列にする
char *doruzero = "";
strcat(c, doruzero); // c が本当にchar型ならエラーにならんはず
printf("%x",c);
cout << '\n' << c;
getchar( );
}
エラー E2094 test.cpp 5: << 演算子が使われたがクラス istream では
int 型のための定義が存在しない(関数 main( ) )
エラー E2285 test.cpp 7: 'itoa(char *,int,int)' に
一致するものが見つからない(関数 main( ) )
*** 2 errors in Compile ***
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
【お題】 ・急に朝起こしてきた母親に言われた一言とは?
-
C言語での引数の省略方法
C言語・C++・C#
-
数値を文字化するにはどうすればいいですか。
C言語・C++・C#
-
itoaわかりません
C言語・C++・C#
-
-
4
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
5
バッファとは何ですか
C言語・C++・C#
-
6
char str[256]の256の意味は?
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
9
0除算して、落ちるプログラムと落ちないプログラム
C言語・C++・C#
-
10
C言語のポインターに関する警告
C言語・C++・C#
-
11
複数の変数を宣言する時、同時に初期化?できないでしょうか?
Java
-
12
C言語初心者の質問失礼します。
C言語・C++・C#
-
13
char型2つを結合し、short型に格納したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
charでの計算?
-
sprintfに同じ変数は使えるか
-
C言語の入力した文字を反転させ...
-
CStringをwchar_tに変換したい
-
YUV⇔RGB変換がうまくいきません。
-
絶対パスからのファイル名の切...
-
C言語です
-
strncpyと_tcsncpy_sのヌルの扱...
-
C言語のfor文です。 繰り返しの...
-
atoi( ) の反対をやりたい
-
C言語のポインターで詰まっている
-
データの取得をしたいのですが…
-
下記のプログラムがコンパイラ...
-
間接参照のレベルが異なっています
-
型変換
-
C言語 ミリ秒を日付に変換には
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charでの計算?
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
fgetsなどのときのstdinのバッ...
-
'const char *' 型は 'char *' ...
-
間接参照のレベルが異なっています
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
ネットワークにつながっている...
-
型変換
-
テキストデータをそのままバイ...
-
文字列ポインタを結合
-
3桁区切(コンマ)記号をつけ...
-
C言語です
-
Win32APIでのエディットボック...
-
TCHAR文字列?の特定部分の数字...
-
絶対パスからのファイル名の切...
おすすめ情報