• 締切済み

至急お願いします

高専生です。 文字列で数字列を入力。 それを実数値に変換し そこから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; }

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>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)
回答No.3

>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)
回答No.2

全体は見てませんが・・・ > printf("%s%d",ss); ←ここです!!! の所は printf("%s",ss); %d は不要 違ってたらスルーして下さい。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>char s[5],ss[100]; >printf("5桁以内の文字列を入力せよ\n"); C言語の文字列は、'\0'で終わります。 最大5桁の文字列を取得するには、配列のサイズは'\0'の分を考慮した[6]でなければなりません。 >if(keta>5){ >printf("文字数不正\n"); >} 不正が発生した後も、結局は次のwhileループに突入していますね。 不正が発生したら実行を中止する必要はありませんか?