- 締切済み
至急お願いします
高専生です。 文字列で数字列を入力。 それを実数値に変換し そこから8進数に変換し 再び文字列とて出力したいです。 変換はできているのですが printf("%s",ss)が実行されると 正しい8進数の直後に文字化けまたは 0が出力されてしまい困っています。 例えば10進数の225は8進数では341ですが このプログラムでは出力が341'0'と0が付きます 同様に10進数12345は8進数では30071ですが これでは30071'ヨ@0'と意味不明な文字化けが付きます どうか解決法をご教授ください! 以下自分が組んだプログラム ______________________________________________________ #include<stdio.h> #include<string.h> void main(){ char s[5],ss[100]; int i=0,num=0,keta,hex=0,j=1,cnt1=1,k,x; while(1){ printf("5桁以内の文字列を入力せよ\n"); scanf("%s",&s); keta=strlen(s); //桁をカウントさせる if(keta>5){ printf("文字数不正\n"); } else { break;//条件満たしたら次へ } } while(1){ //桁数から1の倍数の数字を作ります 次のループのギミック j=j*10; cnt1++; if(cnt1>=keta){ break; } } while(1){ if(s[i]=='\0'){ break; } hex=s[i]-'0'; num=num+hex*j; j=j/10; ++i; //文字列で入力されたのを実数に直しました } printf("変換後=>%dです\n",num);//確認用表示 k=keta-1; for(;k>=0;k--){ int x=num%8; ss[k]='0'+x; num=num/8; } s[keta]='\0'; printf("%s%d",ss); ←ここです!!! return; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
>void main(){ これでいいの? 末尾の return; は? 「些末なこと」と考えてはいけませんよ。 少なくとも、学校でのプログラミングでは、先生の方針に従うべきです・・。 >どうか解決法をご教示ください! ・ポイントは、下位桁から判明し、何桁になるか不明な8進数表現文字(列)を、文字配列のどこに入れるか、と思います。 下のソースでは、用意した文字配列の [ 14 ] から前方に順次格納(★)し、格納し終えた先頭(◆)を指定して出力(8進数ぽく頭に0)しています。 なお、質問者様のソースは1回限りですが、下では、6桁以上の入力があるまで続けます。 また、細かいことですが、0 が入力されたときのことも考慮しています(質問者様のソースでは、00 )。 >至急お願いします 間に合いませんでしたね、大幅?に変更しましたので、こんな方法もあるのか程度に・・。 #include<stdio.h> #include<stdlib.h> void main( void ) { char s[ 8 ], ss8[ 16 ] = { '\0' }; int iVal10, i; while( 1 ){ i = 15; // 文字列終端 '\0' ↑ printf( "5桁以内の数字列を入力せよ(6桁以上:終了)\n" ); scanf( "%s", &s ); iVal10 = atoi( s ); // 文字列 → 数値 if( iVal10 > 99999 ){ printf( "%s 終了\n", s ); break; } printf( "10進=>%7d です\n", iVal10 ); while( iVal10 ){ ss8[ --i ] = (char)( ( iVal10 % 8 ) + 0x30 ); // ★ iVal10 /= 8; } ss8[ --i ] = '0'; // 8進数ぽく printf( "8進=>%+7s です\n\n", &ss8[ i ] ); // ◆ 前半部に前回のゴミ?があってもOK } } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
- titokani
- ベストアンサー率19% (341/1726)
>printf("%s",ss)が実行されると >正しい8進数の直後に文字化けまたは >0が出力されてしまい困っています。 変換結果の最後に、'\0'が入ってないからでしょう。 >k=keta-1; >for(;k>=0;k--){ >int x=num%8; >ss[k]='0'+x; >num=num/8; >} ここで、変換結果をssに入れていますが、まず'\0'をssに入れてから変換を始めるとうまくいくと思います。 #添え字は自分で考えてね。
- goo39
- ベストアンサー率36% (13/36)
全体は見てませんが・・・ > printf("%s%d",ss); ←ここです!!! の所は printf("%s",ss); %d は不要 違ってたらスルーして下さい。
- asuncion
- ベストアンサー率33% (2127/6289)
>char s[5],ss[100]; >printf("5桁以内の文字列を入力せよ\n"); C言語の文字列は、'\0'で終わります。 最大5桁の文字列を取得するには、配列のサイズは'\0'の分を考慮した[6]でなければなりません。 >if(keta>5){ >printf("文字数不正\n"); >} 不正が発生した後も、結局は次のwhileループに突入していますね。 不正が発生したら実行を中止する必要はありませんか?