• ベストアンサー

分岐について

「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; }

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

  • ベストアンサー
回答No.3

#include <stdio.h> #include <string.h> int main(void) { char buf[256]; while ( 1 ) { memset( buf, '\0', sizeof( buf ) ); printf( "y or n :" ); fgets( buf, sizeof( buf ), stdin ); if ( strncmp( buf, "y\n", sizeof( buf ) ) == 0 ) break; if ( strncmp( buf, "n\n", sizeof( buf ) ) == 0 ) break; puts( "Error. Input y or n.\n" ); } return 0; } 変数名は一部変えてあります。 改行コードを'\0'で置き換えたり一寸無駄があるかな?

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

getchar(),tolower()なんかを使ってみたらどうでしょう

noname#16765
noname#16765
回答No.4

自分もそれをこの前作りました。 char *str:入力したい文字(文字列は無理) char *format,... :printfと同じ引数(表示したいメッセージ) 使い方:a = Input_True_char("ny","y or n :") これでnかyしか選べません #include<stdlib.h> char Input_True_char(char *str,char *format,...) { char mozi; va_list args; va_start(args,format); do{ vfprintf(stdout,format,args); rewind(stdin); mozi = getchar(); }while(strchr(str,mozi) == NULL); va_end(args); return mozi; }

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

まず、&judge[0]は間違ってないけど普通は単にjudgeと書きますね。 あとは文字列操作のライブラリ関数を活用しましょう。 改行文字を探している部分はindexを使える。 char *p; p = index(judge, '\n'); if (p!=NULL) {  *p = '\0'; } 文字列の比較にはstrncmpが使える。 if (strncmp(judge, "y", sizeof(judge))==0||strncmp(judge, "n", sizeof(judge))==0) { ... }

回答No.1

なにがどうスッキリしないのか考えるといいと思います。

関連するQ&A

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

    ある文字を入力し、それをカンマ区切りして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; } }

  • realloc

    reallocの使いかたに関してです。 #include <stdio.h> #include <stdlib.h> main () { int narray[5]; int *pn, *pn2; pn=narray; printf("%p <=> ",pn); printf("%p\n",narray); memset(pn,0,sizeof(int)*5); if((pn2 = (int *)realloc(pn, sizeof(narray)*2))==NULL){ printf("error"); exit(0); } pn=pn2; memset(pn,0,sizeof(int)*5*2); printf("realloc!\n"); return(0); } この記述はどこかまちがっているでしょうか? 最初の配列のサイズを2倍に増やすというだけのぷろぐらむなのですが。 どうもreallocの場所でセグメンテーションフォルトになります。

  • enterでループ終了

    #include <stdio.h> int main(void) { char str[255]; int i, len; while (1){ printf("文字列を入力してください:"); if (fgets(str, sizeof(str), stdin) == NULL) { break; } len = strlen(str); if (len > 0 && str[len - 1] == '\n') str[len - 1] = '\0'; if (str[0] == '\0') break; enterで終了するプログラムの例ですが、 if (fgets(str, sizeof(str), stdin) == NULL) のNULLはどういった理由で必要ですか? また、 if (len > 0 && str[len - 1] == '\n') str[len - 1] = '\0'; を消して、 if (str[0] == '\0') break; を、if (str[0] == '\n') break; と書き換えれば、終了すのではないですか?不適な理由がありますか?

  • 下のコードの修正をお願いします。

    終了処理、バッファのクリアなど、ほとんどの処理は出来たのですが、唯一a,b,cの入力数が上限の桁数LIMITをオーバーしてしまった場合に本来エラーが表示されなければならないのにそのまま正常処理で最大値が出力されてしまいます。つまり、サブ関数void disp_errorでの処理がmain関数で実行されません。 どこを直せばいいのでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT (5) #define NULLB '\0' #define ECOUNT (3*LIMIT + 4) #define EWORD (3) #define NORMAL (0) #define ABNORMAL (-1) #define LF '\n' int word_judge(char array[]); void disp_error(int x_len , int y_len , int z_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 ; int max ; char input[ECOUNT+1] ; char a[ECOUNT+1] ; char b[ECOUNT+1] ; char c[ECOUNT+1] ; char array[ECOUNT+1] ; char end[EWORD+1] ; 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 ; max = 0; memset(input , NULLB , sizeof(char) *ECOUNT+1) ; memset(a , NULLB , sizeof(char) *ECOUNT+1) ; memset(b , NULLB , sizeof(char) *ECOUNT+1) ; memset(c , NULLB , sizeof(char) *ECOUNT+1) ; memset(end , NULLB , sizeof(char) *EWORD+1) ; printf("a,b,c ?:") ; fgets(input , ECOUNT+1 , stdin) ; input_len = strlen(input) ; if(input_len <ECOUNT) { a_len = strlen(a) ; b_len = strlen(b) ; c_len = strlen(c) ; sscanf(input , "%[^,], %[^,], %s" , a , b , c) ; if(a[0] != NULLB && b[0] != NULLB && c[0] != NULLB) { if(word_judge(a) == NORMAL && word_judge(b) == NORMAL && word_judge(c) == NORMAL) { if(a_len > LIMIT || b_len > LIMIT || c_len > LIMIT) { disp_error(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) ; max = number_a ; printf("最大値:") ; if(number_b > number_a) { max = number_b ; if(number_c > number_b) { max = number_c ; } } else { if(number_c > number_a) { max = number_c ; } } printf("%d\n" , max) ; break ; } } else { printf("文字が混ざっています。 \n") ; } } else { printf("正しく、入力をしてください。\n") ; } } else { if(input[ECOUNT-1] == LF) { } else { /* バッファのクリアを行う */ while(getchar() != LF); } printf("入力数が多いです。\n") ; } } while(1) { printf("終了しますか? y/n:" ); fgets(end , EWORD+1 , stdin ) ; end_len = strlen(end) ; if(end_len < 3) { if(end[0] != 'y' && end[0] != 'n') { printf("y or nを入力して下さい。\n") ; } else { break ; } } else { if(end[EWORD-1] == LF) { } else { while(getchar() != LF) ; } printf("入力が間違っています。y or nを入力しなおしてください。\n") ; } } } return 0 ; } int word_judge(char array[]) { int array_len ; int i ; int sub_number ; int r_value ; sub_number = 0 ; r_value = NORMAL ; array_len = strlen(array) ; for(i=0 ; i<array_len ; i++) { sub_number = isdigit(array[i]) ; if(sub_number != 0) { r_value = NORMAL ; } else { r_value = ABNORMAL ; break ; } } return r_value ; } void disp_error(int x_len, int y_len , int z_len) { int fc ; fc = 0 ; if(x_len > LIMIT) { fc += 1 ; } if(y_len > LIMIT) { fc += 10 ; } if(z_len > LIMIT) { fc += 100 ; } switch(fc) { case 11 : printf("aとbの桁が多いです。 \n") ; break ; case 110 : printf("bとcの桁が多いです。 \n") ; break ; case 101 : printf("aとcの桁が多いです。 \n") ; break ; case 1 : printf("aの桁が多いです。 \n") ; break ; case 10 : printf("bの桁が多いです。 \n") ; break ; case 100 : printf("cの桁が多いです。 \n") ; break ; } }

  • scanfに文字が入力されたときにエラー表示させる

    こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }

  • 3目並べのプログラムについての質問です

    以下のようにプログラムをつくりました #include <stdio.h> #include <stdlib.h> #include <time.h> void cleanSquare(void); void hand(char); void hand_CPU(char); void printSquare(void); void judge(void); void three(char, char, char); char square[3][3]; int nokori = 9; int main( void ) { cleanSquare(); printSquare(); while(1) { printf("Your turn.\n"); printf("Input (x,y) :"); hand('o'); printf("CPU chose (x,y):"); hand_CPU('x'); } } void cleanSquare(void) { int x, y; for(x = 0; x < 3; x++) { for(y = 0; y < 3; y++ ) { square[x][y] = ' '; } } } void hand(char mark) { int h, v; scanf("%1d%1d", &h, &v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("引き分け\n"); exit(1); } } void hand_CPU(char mark) { int h, v; srand(time(NULL)); //scanf("%1d%1d", &h, &v); h = rand() % 3; v = rand() % 3; printf("(%d,%d)\n", h, v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("Tie \n"); exit(1); } } void printSquare(void) { int cnt; printf("\n 0 1 2\n"); printf(" -------------\n"); for(cnt = 0; cnt < 3; cnt++) { printf("%1d| %c | %c | %c |\n", cnt, square[0][cnt], square[1][cnt], square[2][cnt]); printf(" -------------\n"); } } void judge(void) { int x, y; for(y = 0; y < 3; y++) { three(square[0][y], square[1][y], square[2][y]); for(x = 0; x < 3; x++) { three(square[x][0], square[x][1], square[x][2]); three(square[0][0], square[1][1], square[2][2]); three(square[2][0], square[1][1], square[0][2]); } } } void three(char a, char b, char c) { if(a == ' ') { return; } if(a == b && b == c) { if(a == 'o') { printf("Win! \n"); } else { printf("Lose. \n"); } exit(1); } return; } 以前、学校の課題としてでたものを復習していたのですが、わからない部分がでてきました。 このプログラムを次のように改造したいのですが、どのように改造すればいいのかわかりません 1.ゲーム全体を関数化する main関数でこの関数を呼び出すと何回もゲームができるようにする int game(int n)と宣言しようと考えています 2.マス目の大きさを関数game()が引数として受け取ったnを、n×nのマス目でゲームができるようにする nは、ゲームごとにmain関数で入力 10×10までの大きさ 3.自分の番の時に、座標を入力する時に負の値が入力されたら、ゲームを終了させる 4.勝敗の記録と表示 例えば、引き分けを0、勝ちを1、負けを2、途中終了を-1 を戻り値として返すようにして、途中終了以外の場合はゲームの成績を 勝ち:3、負け:2、引き分け:0のように表示する 5.ゲーム終了後に続けるか、やめるかの選択 文字を一文字入力して、'y'なら1を返し、'n'なら0を返す それ以外の文字だったら、再入力させるという処理を関数化する int newgame(void)として宣言しようと考えています また、この関数の戻り値が0の場合プログラムの終了、1なら新しいゲームの開始 です。長くて申し訳ないですm(_ _)m よろしくお願いしますm(_ _)m

  • 課題なんですが・・・

    プログラムが書いてあるため非常に長文です。 お許しください。 いま、C++でのプログラミング課題が出ているのですが、 正方形の中抜きは出来たのですが、三角形・逆三角形の中抜きが作れません・・・。 もちろん、宿題・課題の丸投げは禁止されているのは分かっています。 しかし、一向に進まないのでなにかヒントだけでも(できたら答えも・・・というのは冗談です)教えていただけないでしょうか。 ちなみに問題は、入力数分の縦×横の図形を描くプログラムを組む。 というものです。 #include <stdio.h> void main (void) { /*変数の宣言*/ int cnt1, cnt2,n; /*数字の入力*/ do { printf("数字2~19を入力してください:"); scanf("%d",&n); if(n<2 || n>19) { printf("入力エラーです!!\nもう一度"); } }while(n<2 || n>19); /*正方形の作成*/ printf("\n正方形\n"); for(cnt1=0;cnt1<n;cnt1++) { for(cnt2=1;cnt2<=n;cnt2++) { printf("*"); } printf("\n"); }   printf("\n三角形\n"); for(cnt1=1;cnt1<=n;cnt1++) { for(cnt2=0;cnt2<cnt1;cnt2++) { printf("*"); } printf("\n"); } printf("\n逆三角形\n"); for(cnt1=1;cnt1<=n;cnt1++) { for(cnt2=n;cnt2>=cnt1;cnt2--) { printf("*"); } printf("\n"); } printf("\n三角旗\n"); for(cnt1=1;cnt1<=n;cnt1++) { for(cnt2=0;cnt2<cnt1;cnt2++) { printf("*"); } printf("\n"); } for(cnt1=n-1;cnt1>=0;cnt1--) { for(cnt2=0;cnt2<cnt1;cnt2++) { printf("*"); } printf("\n"); } printf("\nダイヤ形\n"); for(cnt1=1;cnt1<=n;cnt1++) { for(cnt2=1;cnt2<=n*2;cnt2++) { if(cnt2<=n-cnt1 || cnt2>=n+cnt1) { printf(" "); } else { printf("*"); } } printf("\n"); } for(cnt1=n-1;cnt1>0;cnt1--) { for(cnt2=1;cnt2<=n*2;cnt2++) { if(cnt2<=n-cnt1 || cnt2>=n+cnt1) { printf(" "); } else { printf("*"); } } printf("\n"); } printf("\n中抜き正方形\n"); for(cnt1=1;cnt1<=n;cnt1++) { if(cnt1==1 || cnt1==n) { for(cnt2=1;cnt2<=n;cnt2++) { printf("*"); } } else for(cnt2=1;cnt2<=n;cnt2++) { if(cnt2==1 || cnt2==n) { printf("*"); } else { printf(" "); } } printf("\n"); } rewind(stdin); getchar(); }

  • reallocとstrtokの併用について

    fscanfで文字列を読み込み、strtokでカンマ区切りにするという関数を作りたいのですが、 reallocすると先頭から徐々にデータが文字化けしていきます。 まず最初に4つ分のchar*を取ります。 もし、5つ目が見つかったらさらに4つ増やし、9つ目が見つかったらさらに。。。というようになっております。 n個目の判定はcntがn-1で真になり、reallocが成功したら個数を増やすようになってます。 5つ目が見つかった時点では出力に問題は無いのですが、6個目から侵食が始まっていきます。 原因がどうしても自分では分からなかったので、誰かお願い致します。 words.txtの内容(末尾改行なし) iii,jjj,kkkkkkkkk,l,m,n,ooooo,pppppppp,a,s,d,f,g main.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include"C:\borland\bcc55\Include\malloc.h" int readlinefile(FILE *fp,char **words){ int cnt=0,len; char *line=(char *)malloc(256); char *tmp; if(line==NULL) return 0; if(fscanf(fp,"%s",line)!=EOF){ if((tmp=(char *)realloc(line,sizeof(char)*(strlen(line)+1)))==NULL){//できるだけメモリを節約してみる return 0; }else{ line=tmp; } len=strlen(line); printf("line:%d:%d:%s\n",len,_msize(line),line); if(len>1){//ファイル終端の改行を排除 int i; char *tok=strtok(line,",");//カンマで区切ったアドレスを得る while(tok){ if(cnt==0)printf("tok:1st:%x\n",tok); if(cnt>3&&cnt%4==0){//サイズが足りなくなった時 char **tmp2; if((tmp2=(char **)realloc(words,sizeof(char *)*(4+4*(cnt%4))))==NULL){ printf("words realloc ERROR\n"); break; }else{ printf("realloc\n"); words=tmp2;//reallocを適用 } } words[cnt]=tok; if(cnt){ printf("line(func)"); for(i=0;i<len+1;i++){ printf("%c",words[0][i]); } printf("\n"); } tok=strtok(NULL,","); printf("words[%d]:%x:%s\n",cnt,words[cnt],words[cnt]); printf("\n"); printf("tok:%d回目:%x\n",cnt+1,tok); cnt++; } return cnt;//正常終了した }else{ free(line); } } return 0; } int main(){ FILE *fp=fopen("words.txt","r"); if(fp){ int cnt=1; while(cnt){ int i; char **words=(char **)malloc(sizeof(char *)*4); words[0]=NULL; cnt=readlinefile(fp,words); printf("mainに戻りました\n"); if(cnt) printf("words:%d\n",cnt); for(i=0;i<cnt;i++){ printf("words[%d]:%x:%s\n",i,words[i],words[i]); } free(words[0]); words[0]=NULL; printf("\n"); free(words); } }else{ printf("file open ERROR\n"); } return 0; } 実行結果 なぜかコピペできないので実行するか斧でダウンロードお願いします。 http://www1.axfc.net/u/3352789.txt 全てまとめたもの http://www1.axfc.net/u/3352796.zip

  • 変わらない・・・。

    ↓のプログラムについて (1)break文をexit(0)とreturn(0)にするとどうなるか? (2)13行目と14行目にif(i>=n){break;}を入れるとどうなるか? *プログラムは書き換えてよい。 という問題なんですが私にはさっぱりです・・・。 #include<stdio.h> int main() { int i,n,total; while(1){ printf("整数n?");   scanf("%d",&n);     if(i>=n){break;} total=1; for(i=n;1<=i;i++){ printf("i=%d ",i); total*=i; } printf("total=%d\n",total); } printf("Thanks\n"); return(0) } できたら理由も教えてください。 よろしくおねがいします。

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

専門家に質問してみよう