• ベストアンサー

数値をポインタ文字配列に変換

整数型の数値を文字に変換しようと sprintfを使おうと思ったのですが ポインタの文字型配列を第一引数 にして変換すると エラー出てしまいます 開発環境はVC++2010で WindowsXPproです これは仕様なんでしょうか? もしそうなら他の変換方法はありますか?

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

対処としては…… char* yosoumozi[50]; yosoumozi[i] = malloc(10); sprintf(yosoumozi[i],"%d",yosou); /* 動的確保した領域に書き込み */ 使い終わったらfree()で解放して下さい。 char yosoumozi[50][10]; sprintf(yosoumozi[i],"%d",yosou); /* yosoumozi[i][0]~yosoumozi[i][9]の間に書き込み */ こっちなら解放は不要です。 サイズによってはスタックオーバーフロー起こす可能性もありますが。 どっちも数字として格納できるのは9桁までですけどね。 この書き方だと。

spmz1311
質問者

お礼

出来ました! ありがとうございます^^ わかり易かったです

その他の回答 (4)

回答No.5

50byte程度なら、スタックでも十分(と個人的に思っている)ので、確保すれば良いだけです。 int yosou; char yosoumozi[50]; sprintf(&yosoumozi[i],"%s",yosou); 以上ですね。

spmz1311
質問者

お礼

出来ました! 回答ありがとうございます^^

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>char* yosoumozi[50]; >sprintf(yosoumozi[i],"%d",yosou); yosoumozi[0]やyosoumozi[1]はドコを指しているのでしょうか? malloc()等で動的確保する。など行わないと「アドレスを指す箱を用意したけどどこ指しているかは未定」な状態ですが。 ダイレクトメールを送りたい。ということで封筒を用意(char* yosoumozi[50])しました。 入れるダイレクトメールの文章(yosouを数字として出力)も出来ました。 封筒に入れて…ポストに投函しました。 けど、届きませんでした。 宛名が未記入ですから。 ……あんましいい例えじゃないなぁ…。 >これは仕様なんでしょうか? 仕様…ですね。 「メモリ管理はプログラマの責任」ですし。 CPUは指定されたように「どっか判らないけどポインタが指している先」に書き込もうとしました。 が、OSにより「ソコには書いちゃダメ」と止められました。 その「どっか判らないけど指している先」がアクセス可能で書き換えも可能な場所だった場合には、OSに止められることもなく書き換えできます。 # 書き換えた結果、ハードティスクを破壊する。とかいう動作をしても正常です。そういうふうに書き換えたということになりますから。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

具体的にどのように記述して、どのようなエラーが出ましたか? >開発環境はVC++2010で http://msdn.microsoft.com/ja-jp/library/ybk95axf%28v=vs.100%29.aspx TCHAR関係で間違えている。とか… UNICODE 文字セットを使用する。の状態でsprintf()使って、渡したアドレスがchar*型だった…とか。 セキュリティ強化版を使うように。というワーニングだった…とか。

回答No.1

ソースを出して頂ければ、具体的なアドバイスが可能です。

spmz1311
質問者

補足

全部だと長くなりそなのでポイントを書きます int yosou; char* yosoumozi[50]; sprintf(yosoumozi[i],"%d",yosou); 一応こんな感じです 変数名は気にしないでください ビルドするときにエラーは出ないんですが 実行した時に 「"0x1027d337"の命令が"0x00000000"のメモリを参照しました。 メモリが"written"になることはできませんでした。」 とでます ソースはこんなかんじでいいでしょうか? 足りないのであればまた回答よろしくお願いします

関連するQ&A

  • 文字型配列に数値を文字として代入したいです

    掲題の通りですが、listという配列に数値や文字を入れたいです。 数値は必ず整数1桁、文字はAかBの1文字です。 配列は char list[] = new char[8]; として定義しています。 numにAかBを入れると、代入も表示もうまくいきます。 しかし、数値を入れると以下のような動作となります。 list[i] = num とすると 「不適合な型: 精度が失われる可能性があるintからcharへの変換」 というエラーが表示されます。 list[i] = (char)num; に変更するとエラーは出ませんが、表示がうまくされません。 list[i] = String.valueOf(num); に変更すると 「エラー: 不適合な型: Stringをcharに変換できません:   list[i] = String.valueOf(num);」 というエラーが表示されます。 何か良い方法はないでしょうか。

  • intの数値を文字列に変換

    intの数値を文字列に変換したいのですが環境が ファームウェア、ライブラリのitoaやsprintfが使用出来ません。 どの様にすれば返還出来るでしょうか?

  • Ruby1.9での数値→文字変換について。

    Ruby1.9での数値→文字変換について。 以下のようにfloat型の数値を文字に変換したいのですが、 どのようなロジックで書けば宜しいでしょうか? (例) 1.1→"1.1" 1.12→”1.12” 1.123→”1.123” sprintf("%f",data)を使っていますが、上記の1.1の例ですと "1.100000"となってしまいます。つまり、不要な"0"を取りたいのです。 また、少数点以下の桁数によっても考慮が必要に思われます。 どうかアドバイスをお願い致します。

    • ベストアンサー
    • Ruby
  • 数字を文字型に変換する

     今日はCの初心者です。  数字を文字型に変換するのはsprintf以外に無いのでしょうか。  sprintfは変換後の数字を配列に入れるようになっていますが、使いにくいです、もっと簡単にキャストできないのでしょうか。  宜しくお願いします。

  • 構造体配列のポインタを引数に

    こんばんは。 Visual C++ 2008 Express Edition を使っています。 C++のあるプログラム内の関数で、構造体の1次元配列のポインタを引数に取ろうと思っているのですが上手くいきません。 関数の目的としては、関数側と呼び出す側のファイルを分けているので、関数側のグローバルな構造体配列のアドレスに呼び出し側の構造体配列のアドレスを代入することです。 構造体はExampleと型を定義してあります。 ・関数側 Example *global_ex[10]; void GetEx(Example *ex[])  // ←2つ目のエラー {   global_ex = ex;  // ←1つ目のエラー } ・呼び出し側(呼び出し側の関数内)   Example ex[10];   (exの初期化)   GetEx(&ex); ・エラー  error C2440: '=' : 'Example *[]' から 'Example [15]' に変換できません。配列型への変換はありませんが、参照またはポインタから配列への変換があります。  error C2664: 'GetEx' : 1 番目の引数を 'Example (*)[15]' から 'Example *[]' に変換できません。 プログラムとエラーは以上です。 何をすれば解決できるのか、ご存じの方いらっしゃいましたらよろしくおねがいします。 CとC++は独学で学んでいるので偏りがあると思います。 「基本的な○○が分かっていないのでは?」と感じたらその点もご指摘頂けると嬉しいです。。

  • VC2005で数値を文字列に変換

    数値を文字列に変換しようとしているのですがうまくいきません。 _itoa(),sprintf()を試したのですが何れもうまくいきません。 _itoa()の場合は, #include <stdlib.h> #include <stdio.h> CString k; int answer = 2; _itoa(answer,k); のようにすると error C2660: '_itoa' : 関数に 2 個の引数を指定できません。 というようなことが表示されます。 sprintf()の場合は、 #include <stdio.h> char* k; int answer = 2; sprintf(k,"%d",answer); のようにするとコンパイルは出来るのですが計算をし始めると、 Run-Time Check Failure #3 - The variable 'k' is being used without being defined. というメッセージボックスが表示されます。 誰か助けてください。

  • sprintf関数での文字列変換について

    マイコンにて、 C言語で浮動小数点の数値を表示するプログラムを作成しているのですが、 PRINT_OUT("123.456"); のように、文字列を直接指定した場合は正しく表示されるのですが、 sprintf()関数を用いて、浮動小数点を文字列に変換した場合、 buf char[10]; sprintf(buf,"%lf",123.456); PRINT_OUT(buf); とした場合はプログラムが暴走?(恐らく配列破壊を起こしていると 思われますが、)してしまい、上手く動作しません。 (但し、整数の場合は正常に動作します。) そこで、質問させていただきたいのですが、 "123.456"のように直接文字列を指定した場合と、浮動小数点123.456 をsprintf()関数を用いて文字列に変換した"123.456"の書式に何か 違いはあるのでしょうか?よろしくお願い致します。

  • 数値→文字列変換関数

    ・数値を文字列化する関数StoAを作成する。 書式:char *StoA(short nVal); 引数:short nVal; 文字列化する数値 戻り値:数字文字列のポインタ 処理:nValで与えられたshort型の数値を文字列に変換し、そのポインタを返す。 呼び出し側の書式は以下の通り。 void main(void) { char *pc; pc = StoA(123); printf("%s\n", pc); pc = StoA(-1234); printf("%s\n", pc); } です。明日までの専門学校の課題なのでどうか、どなたか助けて下さい。

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

専門家に質問してみよう