• 締切済み

sprintfの障害

C言語のコーディングの質問です。 以下のロジックを見てください。 ========================================= char [12] strA double dblA dblA = 1000 sprintf(strA , "%06.0f", dblA / 1000) ========================================= 上記のロジックを処理すると、結果が必ず ”-00001”となります。 他の行にも同じようなロジックを記述しているのですが 上記の現象があこるロジックの行の時のみ 発生します。 他の処理がメモリを潰しているのかと思い いろいろ調査してみたのですが、それらしき 異常箇所は見受けれれません。また、コンパイラ についても異常はありませんでした。 デバック実行で変数「strA」にセットされる 値をみるとaprintfの処理直後に"-00001"が セットされるのは実証済です。 このような現象が発生することはあるのでしょうか? 原因、対応方法についてご教示お願いいたします。

みんなの回答

  • LHS07
  • ベストアンサー率22% (510/2221)
回答No.5

Visual C++ 6.0 では何も表示されませんが・・・。 sprintfは文字数を返すのでは??? sprintf 関数は、buffer に格納した文字数を返します。この数には終端の NULL 文字は含まれません。 #include<stdio.h> void main(void) { char strA[12] ; double dblA; dblA = 1000; sprintf(strA , "%06.0f", dblA / 100); }

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

で, あなたの使っている処理系は?

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

そのものズバリのコードをコピー&ペーストできないのは、 何か理由がありますか?

全文を見る
すると、全ての回答が全文表示されます。
  • akiyousan
  • ベストアンサー率29% (13/44)
回答No.2

実際に現象が起こっているソースが見たいです^^; >他の行にも同じようなロジックを記述しているのですが・・・ 同じ、ではなく、同じような、というところも気になります。 その差分が問題になっているんではないでしょうか? 同様の箇所全部で意図しない結果になっているわけではない以上、 原因はロジック自体にあるのだと考えたいところですが、 質問内容にあるものだけでは情報不足だと思われます。

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

提示されたコードはコンパイルエラーですね。 char strA[12];だと介錯して、 以下のコードを実行しました /* WinXP Sp2 / VC++6.0(インデントは全角空白)*/ #include <stdio.h> int main( int argc, char* argv[] ) {  char strA[12];  double dblA;  dblA = 1000;  sprintf(strA , "%06.0f", dblA / 1000);  printf( "%s\n", strA );  return 0; } 私の環境で実行結果は 000001 Press any key to continue となりました。 実行環境の問題でしょうかね。。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • sprintf 初歩的な質問

    お世話になっております。 最近独学でC言語の勉強を始めたのですが型の違う値の代入に関して わからないことがあり質問します。 ■やりたいこと■ char型dataの値を2で割った余りを char型ansの[0]から順番に格納してく。 (2の補数を取るためにこのような処理を 考えています(10進を24ビット2進へ変換したい)) ■コード■ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> int main(){ char data[256]="9"; int y; int i; char ans[25]; char* p_ans = ans; y=atoi(data); for(i=0;i<24;i++){ sprintf(ans[i], "%d",y%2); //←エラー y = y/2; } } ■質問■ 上記ソースの中のエラー部分をどのように記述していいのか わかりませんでした。初心者的な発想でポインタを使う方法はと思い sprintf(*(p_ans+i),"%d",y%2); というような記述も試してみましたが駄目でした。 この部分をどのように書いたらいいか詳しい方、教えていただけると 助かります。以上、よろしくお願いします。

  • COBOL 9(02)で定義した変数にマイナス値をセットすると?

    COBOLについて教えてください。 現在、既存のシステム(COBOL)を机上でチェックしているのですが、 関数からの戻り値変数を (例)RC 9(02) で定義して、 異常発生時に、MOVE -1 で値セットしているロジックがありました。 S9タイプではないので、誤動作を起こすと思うのですが、 実際このような処理を行うと、変数RCにはどんな値がセットされるのでしょうか? 実行環境が無いので、動作確認ができず、困っています。(バグかと思うのですが、該当のロジックは幸いにも今まで実行されていなかったようです) よろしくお願いします。

  • ランタイムエラーって

    ネットで接続中エラーメッセイジが出るのですが何のことか分かりません。どなたか教えてください。 ランタイムエラーが発生しました デバックしますか?   行225  エラーオブジェクトを指定してください    はい   いいえ 上記のウィンドウが出ます。環境はWINDOWSxpHOMEeditionでADSLです。

  • c言語でint配列をdoubleに変換

    c言語でマイコンプログラムを作成しています. int型の配列をdoubleに変換するために以下のプログラムを記述し,テストしました. int a[4] = {0,0,1,8}; char s[4]; double d; char *temp; sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); //文字列charをdoubleに変換 d = strtod(s,&temp); 望む結果は 18 ですが,なぜか上記結果は 1800 となりました. 試しに int a[4] = {1,2,3,4}; と,1234と表示されました. 上記より,出力値が左詰めのようになっています. 試しにVisual Studio 2013 C++で同様のプログラムを実行すると,所望の結果を得ることが出来ました. プログラムがおかしいのでしょうか?それともマイコンのコンパイラのバグでしょうか? お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します.

  • Run-Timeエラーの原因に関して教えてください。

    皆様、いつもありがとうございます。 C言語で教えてください。 プログラムを実行すると、下記内容のエラーが発生します。 Run-Time Check Failure #2 - Stack arround the variable 'wk_date' was corrupted 発生場所までは、突き止めましたが、原因が釈然としません。 wk_dateとwk_timeをstaticをつけて定義すると、このエラーが 出ないことから、strcpyの関数でのポインターのトラブル?だと 思うのですが、下記のロジックでおかしい箇所はあるでしょうか? ロジックは、現在の日付と時刻をudateに入れて返すだけです。 static char udate[15]; : : init() { char wk_date[9]; char wk_time[7]; time_t current; struct tm *local; time(&curren;t); /* 現在の時刻を取得 */ local = localtime(&curren;t); /* 地方時の構造体に変換 */ local->tm_year +=1900; local->tm_mon +=1; memset((char*)wk_date, NULL, sizeof(wk_date)); memset((char*)wk_time, NULL, sizeof(wk_time)); sprintf((char*)wk_date, "%04d%02d%02d", local->tm_year, local->tm_mon, local->tm_mday); printf("%s\n", wk_date); sprintf((char*)wk_time, "%02d%02d%02d", local->tm_hour, local->tm_min, local->tm_sec); printf("%s\n", wk_time); memset((char*)udate, NULL, sizeof(udate)); strcpy((char*)udate, strcat((char*)wk_date, (char*)wk_time)); return(0); } 納得のいく、説明を頂ければ幸いです。宜しくお願いいたします。

  • ポインタ

    long ToLittleEndian(char *a,long bytesize){ long i; char lb; char hb; long lsize; lsize=bytesize/2; for (i=0;i<lsize;i++){ hb=*(a++); lb=*(a--); *(a++)=lb; *(a++)=hb; } return 0; } ポインタのアドレスがはみだすとどうなるのでしょうか? 上記のようなコードの場合、最後の処理でポインタaが1バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。

  • あなたのC言語コーディング規約

    勤務先・学校・趣味でC言語を使用してプログラムをしている方の多くは組織内で決めているコーディング規約に沿ってプログラムをしていると思います。 しかし、全てに関して規約化されていることは少なく、ある程度プログラマの裁量に任せていることがあると思います。 そこで、質問です。 「あなたの中で決めているコーディング規約は何ですか?」 「また、その理由は何ですか?」 私が決めているコーディング規約を一例挙げると以下の通りです。 (基本は他人が見ても直ぐに理解できるように心がけてます。) ------ □変数名の前には必ず型を現す文字を書く 理由:観ただけで型が分かるから。 例 :int型は、iData    char配列は、stData    ポインタは、pData □関数の復帰値は、一旦必ず変数に代入する。 理由:代入しないとデバックがしにくい。 例 :iRetCode=func();    switch(iRetCode){      case文    }    の、ように色んな値を試すときに不便。 □if文には、極力「!」(NOT)は使用しない。 理由:複数の論理和・積などが入った場合ややこしいので    elseで代用する。(真の時の処理はわざと書かない) □if文の判定には必ず定数値を左辺に持ってくる。 理由:if(iData=0)とかの"=="を"="にしてしまうミスを防ぐため。    (コンパイラによっては、警告が出るものもありますが…) 例 :if(0=iData)など □while(1)は、基本的に使用しない。 理由:無限ループに陥らないようにするため。 ------

  • ラジオボタンについて

    こんばんは! Access VBAをはじめたばかりです。いきなり、ラジオボタンの操作のロジックが分からなくて困っていますが、ご存知の方、よろしくお願いします。 構成:フォームの上に、rdo1(ラジオボタン)とrdo2とtxt1(テキストボ   ックス)コントロールが配置されています。 仕様:1.rdo1をクリックして選択する    2.rdo1に確定点(黒の点)が表示されると      同時にtxt1にカーソルをセットさせる。 現在のコーディング:    rdo1_MousDownイベントが発生された時、txt1にカーソルを    セットするというふうにコーディングしています。 しかし 今は、    rdo1をクリックしたことと同時に、txt1にカーソルがセットされ   るのですが、rdo1に確定点(黒の点)が反映されません。 なぜ黒の点が確定されないのかが分かりません。 どなたか 教えてください。   

  • ランタイムエラーが発生

    たまにあるサイトにアクセスすると 次のような警告が現れます。 ランタイムエラーが発生しました。 デバックしますか? 行47 エラー:オブジェクトを指定してください。 今までWinMeやWin2000でIE6のバージョンで運用していましたが、このような現象はありませんでしたが、2ヶ月前に再インストールをしてからこのような現象が出てきていると思われます。 現在の環境はWin2000SP4、IEはバージョン6(セキュリティレベルは中)です。 原因と対策をご教示願います。

  • c++でセグメンテーション違反

    c++言語を勉強しているものです。 配列を関数の引数として扱うプログラムを作ろうとしているのですが、 コンパイルが通ったかと思えば実行すると 「セグメンテーション違反です」 と表示されて異常終了してしまいます。 原因がさっぱりわかりません。 OSはLinux(RED HAT ENTERPRISE LINUX 5)、コンパイラはg++(バージョン 4.1.2)です。 これがソースコードです。 #include <iostream> using namespace std; #define BUFSIZE 1024 #define MSG "msg" void test(char buf[]) { //bzero(buf,BUFSIZE); LEGACY memset(&buf, 0, BUFSIZE); sprintf(buf, "%s\n", MSG); cout << buf; cout << "(Terminated)" << endl; return; } int main() { char buf[BUFSIZE]; test(buf); return 0; }