文字化けする理由とは?

このQ&Aのポイント
  • プログラムの実行中に文字化けが発生する現象があります。コンパイラやシェルの設定に問題がある可能性があります。
  • あるサイトで作成したプログラムを実行する際に、ファイル名や入力方法に関係なく文字化けが発生します。
  • 文字化けした部分をメモ帳にコピーすると正常に表示されるため、文字化けは表示の問題かもしれません。
回答を見る
  • ベストアンサー

文字化けするのはなぜ?

コンパイラはMinGWで、シェルはMSYSです。 以下はプログラムは、あるサイトで作成してもらったプログラムです。ファイル名「a.c」でコンパイルはできましたが!? #include <stdio.h> int main( void ) { int judge; int strike = 0; int ball = 0; while( strike < 3 && ball < 4 ){ printf( "ストライク=1 or ボール=2 ?" ); scanf( "%d", &judge ); if( judge == 1 ) strike++; else if( judge == 2 ) ball++; printf( "%dストライク,%dボール\n\n", strike, ball ); } if( 3 == strike ) printf( "3振\n" ); if( 4 == ball ) printf( "4球\n" ); return 0; } 以上です。  シェルのMSYSでファイル名「a」と入力し (a.exeのプログラムを呼び出す。) 画面に a 以下入力すると 1 2 1 2 1 以上、入力後「エンター」→プログラムが働いて ストライク=1 or ボール=2 ?1ストライク,0ボール ストライク=1 or ボール=2 ?1ストライク,1ボール ストライク=1 or ボール=2 ?2ストライク,1ボール ストライク=1 or ボール=2 ?2ストライク,2ボール ストライク=1 or ボール=2 ?3ストライク,2ボール となるのが常ですが、  文字化けした「画像」を添付しました。 文字化けした部分をコピーしてメモ帳にベーストとしたら ちゃんと”回答”が表示されます!  なぜ文字化けすのですか? ちなみに、「コンパイラ」と「シェル」は、教本のに付録したのを使用しています。  教本のプログラムは文字化けはしません。 以上宜しくお願いします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

単純に、「a.c」ファイルを記述している文字コードと、端末表示用の文字コードが一致していない、というだけでしょう。 編集にどんなエディタを使っているか知りませんが、文字コードが表示されるものだったら、a.cと教本のサンプルとを見比べてください。

gogatunijyuku
質問者

お礼

ご回答ありがとうございました。 エディタを無料の秀丸で実施しました。  アイルは「C言語を選択」して落とし込み同じ条件で教本の「サンプルファイル」は問題のプログラムとではサンプルファイルは全く問題なく動きましたが、 問題のファイルはコンパイルはできたものの「文字化け+ループがやまなかったです。  再度難題に取り込みます

gogatunijyuku
質問者

補足

ありがとうございます。 後でエディタの件を追加ができなくて・・テキストエディタはWindowsのメモ帳です。 文字コードは、サンプルファイルも文字化けするアイルともに「ANSI」  です。文字コードは色々、変えてみましたが結果は同じでした。今度は、エディタを変えてみます。しばらくお待ちください。

関連するQ&A

  • コンパイラソフトがmsysなので判りません!?

    以下プログラムですが!? int judge; int strike = 0; int ball = 0; while( strike < 3 && ball < 4 ){ printf( "ストライク=1 or ボール=2 ?" ); scanf( "%d", &judge ); if( judge == 1 ) strike++; else if( judge == 2 ) ball++; } printf( "%dストライク,%dボール", strike, ball );  以上ですが、あるサイトにあるプログラムです。以上のプログラムだけでは私が持っているコンパイルソフトのmsys は、エラーがでて動きません!?それ用のアレンジが分からないので現在は理論だけの勉強をしています。 以上プログラムで、ストライクを1回、ボール1回入力した場合、出力画面にどん画面が出てくるのでしょうか?以下余談ですが、msys 用にアレンジした場合どんプログラムになるのですか? よろしくお願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • 分岐について

    「y」もしくは「n」が入力された時、ループから抜けるプログラムを作りたいとおもっています。 一応作ってはみたのですが、なんかスッキリとしない感じなので、 もっと簡単な方法がありましたら教えてもらえないでしょうか? #include <stdio.h> #include <string.h> int main(void) { int cnt; char judge[256]; cnt = 0; memset(&judge[0],'\0',sizeof(judge)); while(1) { printf("y or n : "); fgets(&judge[0],sizeof(judge),stdin); for(cnt = 0 ; judge[cnt] != '\0' ; cnt++) { if(judge[cnt] == '\n') { judge[cnt] = '\0'; break; } } if((judge[0] == 'y' && judge[1] == '\0') || (judge[0] == 'n' && judge[1] == '\0')) { break; } printf("\nError. Input y or n.\n"); } return 0; }

  • 整数と文字を同時に扱う

    数字を入力して,正ならplusを負ならminusを、 0ならzeroを表示し、ピリオド「.」が入力されたとき プログラムを終了するプログラムを作らなければならないのですが、 整数と文字を同時に扱うのって可能ですか?? 一応、 #include<stdio.h> int main(void){ int a; while (a!='.'){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } で作ったのですが、数字以外を入力すると無限ループします。

  • c言語 文字列と配列

    #include<stdio.h> int charlen(int n); void cap2sml(int b); int main() { char a[100],b[100]; int n,i; /*Input CARACTERS*/ printf("CAPITAL?\n"); fgets(a,100,stdin); charlen(n); printf("total cahrs=%d\n",n); //printf in main cap2sml(i); printf("small=%s\n",b); return(0); int charlen(int n) n=0; while(1){ if(a[n]=='\0') break; n++; } void cap2sml(int b) int i; for(i=0;a[i]!='\0';i++){ b[i]=a[i]+0x20; } b[i]='\0' } のプログラムでエラーがでるのですが、どこを直せばよいでしょうか? ユーザー関数を使い文字列(大文字)を入力したときの文字列の長さと大文字を小文字に変化するプログラムです

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • 文字化け

    C言語初心者です。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("表示"); system("PAUSE"); return 0; } と書いてコンパイルしたのですが「表示」のところが文字化けしてしまいます。 他にも文字化けするかもしれないので、 解決法を教えて下さい。 使っているコンパイラは、Bloodshed Dev-C++です。

  • 文字化けを治す方法ありますか?

    いつも大変お世話になりありがとうございます。 C言語・インタープリターを実行した時に文字化けします。 改善策をアドバイス願います。 ご多忙中恐れ入ります。 ご回答の程、宜しくお願い申し上げます。 コード /*画面に文字を出力するコード*/ #include <stdio.h> int main(void) { printf("ようこそC言語へ!\n"); printf("C言語をはじめましょう!\n"); return 0; } コンパイルと実行時の文字化け。 C:\MinGW>gcc Sample1.c -o Sample1 C:\MinGW>Sample1 繧医≧縺薙◎C險€隱槭∈・・ C險€隱槭r縺ッ縺倥a縺セ縺励g縺・シ・

  • コードのどこが間違っているのかを教えてください。

    ある文字を入力し、それをカンマ区切りして3つに分け、その3つの最大値を表示するプログラムを入力したいです。ただし、条件として、上限の桁数5を越える、文字か数字化の判定を行い、文字が1つでも混ざっている際はエラー表記され再度入力、さらに終了判断を行う際も、あくまで「y」「n」と入力したときのみが正常であり、複数文字を入力する際は、エラー表記され、再度入力という形をとりたいです。 フローを書きながら、サブ関数も使い、LINUXで以下のように書いてみました。 ただ、これだと /*-----------------------------------------*/ /tmp/ccKMOmJN.o: In function `word_judge': kadai6.c:(.text+0x4b2): undefined reference to `isdigits' collect2: ld はステータス 1 で終了しました /*-----------------------------------------*/ となってしまいました。 どのようなコードに直せばいいのでしょうか? すごく長いですが、わかりやすく解説してくださると、とても助かります。 あと、fgets関数やsscanf、getchar関数など、ネット上のサンプルを参照して、使っただけなので、もしかしたら間違ってるかもしれません。 そこについても、教えてくださると、とてもうれしいです。 /* ソースコード */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT (5) #define NULLB '\0' #define ECOUNT (20) #define EWORD (2) int word_judge(char array[]); void digits_judge(int a_len , int b_len , int c_len) ; int main(int argc , char *argv[]) { int number_a ; int number_b ; int number_c ; int input_len ; int a_len ; int b_len ; int c_len ; int end_len ; char input[ECOUNT] ; char a[ECOUNT] ; char b[ECOUNT] ; char c[ECOUNT] ; char array[ECOUNT] ; char end[EWORD] ; end[0] = 'n' ; while( end[0] == 'n' ) { while(1) { number_a = 0 ; number_b = 0 ; number_c = 0 ; input_len = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; end_len = 0 ; memset(input , NULLB , sizeof(char) *ECOUNT) ; memset(a , NULLB , sizeof(char) *ECOUNT) ; memset(b , NULLB , sizeof(char) *ECOUNT) ; memset(c , NULLB , sizeof(char) *ECOUNT) ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("a , b , c ?:") ; fgets(input , ECOUNT , stdin); input_len = strlen(input); if( input_len < ECOUNT-1 ) { sscanf(input , "%[^,] , %[^,], %s" , a , b , c); if(a[0] != NULLB && a[0] != NULLB && c[0] != NULLB) { if(word_judge(a) != 0 && word_judge(b) != 0 && word_judge(c) != 0 ) { a_len = strlen(a) ; b_len = strlen(b) ; c_len = strlen(c) ; if(a_len >= LIMIT || b_len >= LIMIT || c_len >= LIMIT) { digits_judge(a_len , b_len , c_len) ; } else { number_a = strtol(a , NULL , 10) ; number_b = strtol(b , NULL , 10) ; number_c = strtol(c , NULL , 10) ; printf("最大値:") ; if(number_a > number_b && number_a > number_c) { printf("%d\n", a); } else { if(number_b >number_a && number_b > number_c) { printf("%d\n", b) ; } else { printf("%d\n", c) ; } } break ; } } else { printf("文字が混ざっています。\n") ; } } else { printf("正しく入力して下さい。\n") ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力数が多いです。\n"); } } while(1) { int end_len ; char end[EWORD] ; end_len = 0 ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("終了しますか? y/n: "); fgets(end , EWORD , stdin); end_len = strlen(end); printf("\n"); if(end_len == EWORD) { if(end[0] != 'y' && end[0] != 'n') { printf("y or nを入力して下さい。\n"); } else { break ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力が間違っています。y or n を入力しなおしてください。\n"); } } } return 0 ; } int word_judge(char array[ ]) { int array_len ; int i ; int tmp ; int r_value ; tmp = 0; r_value = 0 ; for(i=0 ; i< array_len ; i++) { tmp = isdigits(array[i]) ; if(tmp != 0) { r_value = 1; } else { r_value = 0; break ; } } return r_value ; } void digits_judge(int a_len , int b_len , int c_len) { int a ; int b ; int c ; a = 0 ; b = 0 ; c = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; if(a_len >= LIMIT) { a = 1 ; } else { } if(b_len >= LIMIT) { b = 10 ; } else { } if(c_len >= LIMIT) { c = 100 ; } else { } switch(a + b + c) { case 111 : printf("aとbとcの桁が多いです。\n"); break; case 11 : printf("aとbの桁が多いです。\n"); break; case 110 : printf("bとcの桁が多いです。\n"); break; case 101 : printf("cとaの桁が多いです。\n"); break; case 1 : printf("aの桁が多いです。\n"); break; case 10 : printf("bの桁が多いです。\n"); break; case 100 : printf("cの桁が多いです。\n"); break; } }

  • 使用できない文字

    //bはaの約数かどうかを求めるプログラムです。 #include<stdio.h> main(){ int a,b,amari; printf("2つの整数を入力してください。"); scanf("%d",&a); scanf("%d",&b); printf("整数a=%d",a); printf("整数b=%d",b); amari=a%b; if(c==0){ printf("BはAの約数です。\n"); }    else{ printf("BはAの約数でありません。\n"); } } というプログラムを作ったのですが、 Cmachineでコンパイルすると、 エラー:q3-2:24行目:使用できない文字が現れました。 とでます。一体なにが間違っているのでしょうか? またputsとprintfという関数がありますが、 どちらを使ったほうがいいのでしょうか?putsは \nを書かなくても改行してくれるので、putsのの方が いいのでしょうか?お願いします。

専門家に質問してみよう