gnupackのshellの動作について

このQ&Aのポイント
  • Windowsでgnupackを使ってC言語の学習環境を構築していますが、shellの動作がおかしいです。具体的には、プログラムを実行すると、最初のprintfの前にscanfの入力要求が表示され、その後に全てのprintfが表示されます。
  • Windows標準のcmdからzshを経由してプログラムを実行すると正常に動作しますが、gnupackのzshから直接実行すると問題が発生します。また、最初のディレクトリも異なっています。
  • Windowsのemacsでshellを使用したいと考えています。解決策をご存知の方は、教えていただけないでしょうか?
回答を見る
  • ベストアンサー

gnupackのshellについて

以前Linuxでemacsを使いC言語の学習をしていました。 現在Windowsでgnupackを使い同様の環境を作ろうとしたのですが、shellの動作が少しおかしいので、質問しました。 Cで以下のような、ごく初歩的なプログラムを書いたのですが、gnupackに同梱されているshell(zshとeshell)で実行した所、本来最初のprintfが表示されるはずが、先にscanfの入力要求をされ、その後に3つ全てのprintfが表示される形になってしまいます。 #include <stdio.h> int main (void) { int a, b, sum; printf("Please input two numeral from the keyboad. \n"); scanf("%d", &a); scanf("%d", &b); sum=a+b; printf("When you calcurate the harmony of input %d and %d \n", a, b); printf("It is %d. \n", sum); return (0); } Windows標準であるcmdから実行したり、cmdからzshを通して実行すると、通常通り動作します。 cmdからzshを起動した時と、gnupackのzshを直接起動した時では最初のディレクトリが異なっている状態なので、もしかしたらzshが2つ入っていてgnupackの設定に問題がある可能性も考えられるのかな とも思っていますが・・・ Windowsのemacsでshellを使いたいと考えていますので、何かご存じの方がいらっしゃいましたら、回答をお願いします。 環境は Windows7 UltimateSP1 (64bit) AMD PhenomII X4 955 8Gメモリ gnupack_devel6.00 他何かあれば補足します。 よろしくお願いします。

  • sudo2
  • お礼率100% (1/1)

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

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

> 本来最初のprintfが表示されるはず この認識に若干間違いがあります。 通常、入出力はバッファリングされて、ある程度まとめて行います。 そのため、出力が実行された時間と、実際に出力される時間がずれる(遅れる)ことがあります。 普通、端末に対しては行バッファまたはバッファ無し、ファイル(パイプ等も含む)に対してはバッファ有りでになっていたはずです。 eshellからシェルを呼び出すと、実行したコマンドからの出力を受けとって、emacsのバッファに加えるので、ファイル(パイプ)扱いでバッファリングされているのだと思います。 ・setvbufで設定を変更する ・fflushで強制的にバッファを出力してクリアする といった方法もありますが、もっといいのは、このようなキーボード入力を極力使わないことです。 ・ファイルから読みこむ/ファイルに書いて リダイレクトで読み込む ・コマンドライン引数で指定する

sudo2
質問者

お礼

すばやいご回答ありがとうございます。

sudo2
質問者

補足

今回の場合、あまり変わらないかもしれませんが、zshではなくbashでした。 失礼しました。 Emacsからではなく、単独でbashを起動した時と、cmdからbashを起動した時の動作の違いというのは、単純に処理の速度の違いから来るということでしょうか。

関連するQ&A

  • 警告 W8065について。

    このプログラムを実行したら、実行結果は思い通りになったのですが、 「警告 W8065…プロトタイプのない関数」 と言うのが出ました。  (1)これを消すにはどうすればよいのかを教えてください。  (2)このプログラムはわざと4つに分けているのでこの状態のままプログラムのどこをいじればよいのかを教えてください。 OSはWindows XPでボーランドのコンパイラを使用しています。 #include<stdio.h> int hiki(); int kake(); int waru(); int main(){ int a,b; printf("一つ目の数字\n"); scanf("%d",&a); printf("二つ目の数字\n"); scanf("%d",&b); printf("計%d\n",a+b); hiki(); return 0; } int hiki (){ int c,d; printf("一つ目の数字\n"); scanf("%d",&c); printf("二つ目の数字\n"); scanf("%d",&d); printf("計%d\n",c-d); kake(); return 0; } int kake (){ int e,f; printf("一つ目の数字\n"); scanf("%d",&e); printf("二つ目の数字\n"); scanf("%d",&f); printf("計%d\n",e*f); waru(); return 0; } int waru (){ int g,h; printf("一つ目の数字\n"); scanf("%d",&g); printf("二つ目の数字\n"); scanf("%d",&h); printf("計%d\n",g/h); return 0; }

  • 初心者です。

    以下のソースの説明ですが、例えばnaに5、nbに4を入れたとき、 実行後の表示として  5+6+7+8=26 となるようにしたいのですが、できません。 教えてください。 #include <stdio.h> int main(void) { int sum = 0; int na,nb; printf("整数A:"); scanf("%d",&na); printf("整数B:"); scanf("%d",&nb); /*nbは回数*/ for ( na; na <= nb ;na++){ sum = sum + na; } printf("%dです。\n",sum); return(0); }

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • 整数を3つ読み込み、一番大きいものを表示するプログラム

    3つが違う数であるとしてこうしたんですが、 #include<stdio.h> int main() {int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a>b && a>c){ printf("%d\n",a);} if(b>a && b>c){ printf("%d\n",b); if(c>a && c>b){ printf("%d\n",c); }}return 0;} で、コンパイルはできたんですが、実行できません。3つの数値を入力してもその一番大きい数が出てきません。ifの条件は間違ってはいないと思うんですがやはり、最大が2つあるときのことを考えないとできませんか?

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • この数列プログラムの解説お願いします c言語です

    初項が2です。 #include<stdio.h> int main(void){ int a, n, k, sum = 0; printf("Type k\n"); scanf("%d",&k); a = 2; for(n = 2; n <= k+1; n++){ sum += a; printf("a = %d, sum = %d\n",a, sum); a += (n-1)*(n-1); } return 0; } for文の()内の意味とかよくわかんないです

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }