問題のプログラムを実行する際のエラーについて

このQ&Aのポイント
  • 問題のプログラムを実行する際にエラーが発生します。エラーの原因としては、数値以外の入力や入力文字列が空の場合にエラーメッセージを出力してプログラムを終了させています。
  • プログラムは、3桁の整数の値を入力するまで繰り返し入力を受け付けます。入力が-9999の場合に入力を終了し、それまでの入力数、合計、平均を出力します。
  • プログラムの問題点としては、入力値が数値以外の場合や空文字列の場合にエラーメッセージを表示してプログラムを終了させてしまうことです。正しい入力ができない場合には繰り返し入力を受け付けるように修正する必要があります。
回答を見る
  • ベストアンサー

プログラム問題(3)

以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 3桁の整数の値を入力していき、-9999が入力されたところで、それまでに入力された数の個数と合計を整数で、平均を浮動小数点数で出力するプログラム。 【プログラム】 #include <stdio.h> #include <stdlib.h> #include <string.h> #define streq(a, b) !strcmp((a), (b)) int main(int argc, char *argv[]) { int i, num, sum = 0; double avg; char buf[256]; char *endptr; for (i = 0;; i++) { printf("INPUT>"); if (fgets(buf, sizeof buf, stdin) == NULL) { perror("fgets"); exit(1); } if (streq(buf, "-9999") || streq(buf, "-9999\n")) { break; } if (streq(buf, "") || streq(buf, "\n")) { fprintf(stderr, "数値を入力してください。\n"); exit(1); } num = (int) strtol(buf, &endptr, 0); if (! (*endptr == '\n' || *endptr == '\0')) { fprintf(stderr, "数値を入力してください。\n"); exit(1); } sum += num; } printf("入力数:%d 合計:%d 平均:%g\n", i, sum, (double) sum / i); return 0; }

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

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

VC6にて、ソースコードをコピペ→ビルド→実行で、数パターンのみしか試していませんが問題なく動きました。 開発環境などが明記されていませんが、コンパイルする時に何か問題があったのではないでしょうか?

関連するQ&A

  • TCP/IP通信型大文字・小文字変換プログラム

    TCP/IP通信型大文字・小文字変換プログラムを作りたいです。 しかし、うまく2つのプログラムが接続されません。 恐らく、IPアドレスやホスト名の問題だと思います。 超初心者でそこのところをあまり理解していません。 どなたかプログラムの補足をお願いします。 概要は ・クライアント キーボードから文字列を入力し、サーバーに送信。 サーバーから送信された文字列を画面に出力。 ・サーバー クライアントから送信された文字列に対し、 大文字は小文字に、小文字は大文字に変換して返す。 クライアント側プログラム #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define SOCK_NAME "./socket" int main() { struct sockaddr_in saddr; int soc; char buf[1024]; if ( (soc =socket(AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=inet_addr("192.168.1.1"); saddr.sin_port=htons(1357); if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("connect"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", soc); while(fgets(buf, 1024, stdin)){ if(buf[strlen(buf) -1] == "\n") buf[strlen(buf) -1] = "\0"; write(soc, buf, 1024); read(soc, buf, 1024); fprintf(stdout, "%s\n", buf); } close(soc); return 0; } サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; }

  • TCP/IP通信型電話番号検索プログラムを作りたいです。

    TCP/IP通信型電話番号検索プログラムを作りたいです。 クライアントは以下のようで大丈夫みたいなのですが、サーバの方を修正しなければなりません。 この質問で「TCP/IP通信型大文字・小文字変換プログラム」を発見しました。 サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; } 先生によると、クライアントは同じもので良いそうです。 誰か、助けて下さい。

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • シェルでのパイプの処理の書き方で困ってます

    現段階でのプログラムを載せます (質問に必要な部分を抜粋) #include "自作のヘッダファイル(動作確認済)" void tokun ( char str[], char *chops[], int *flagment , int *pipeflagment, int *pipe, int *num){ char *buf; int i; *pipeflagment = 0; buf = str; for(i=0; i <= SIZE ; i++){ if((chops[i] = strtok(buf," \t")) == NULL) break; if( *chops[i] == '|' ){ *pipeflagment = 1; *pipe = i + 1; *num = i; } buf = NULL; } if( *chops[i-1] == '&' ){ *flagment = BACK; chops[i-1] = NULL; i--; printf("**Background Mode**\n"); }else{ *flagment = FORE; printf("**Foreground Mode**\n"); } if(i > SIZE){ fprintf(stderr,"Too many args\n"); exit(1); } } int main ( void ){ char prompt[ 64 ] = "> "; char command[ 256 ]; int st, id, j, pipenum, num; char *com[256]; enum proc_flag flag; int pipeflag ; int out; int pipe_fd[2]; int child, status; char *buf; pipeflag = 0; fprintf(stderr, "%s", prompt); while (gets(command) != NULL){ if( command == "quit" ){ kill(0, SIGKILL); } buf = command; tokun(command, com, &flag, &pipeflag, &pipenum, &num); //pipe部分の記述開始 if( pipeflag == 1){ com[num] = NULL; if(pipe(pipe_fd) < 0){ perror("pipe"); exit(1); } if((child = fork()) < 0){ perror("fork"); exit(1); } if(child) { /* parent process */ close(pipe_fd[1]); dup2(pipe_fd[0], STDIN); execvp (com[pipenum], com); close(pipe_fd[0]); if(wait(&status) < 0){ perror("wait"); exit(1); } }else { /* child process */ close(pipe_fd[0]); dup2(pipe_fd[1], STDOUT); execvp (com[0], com); // 通信の終了を子プロセスに通知 close(pipe_fd[1]); } } //pipe部分の記述終了 if((id = fork ()) == 0){ if( execvp(com[0], com) == (-1)){ exit(1); } }else { if( flag == BACK ){ waitpid(-1, NULL, WNOHANG); fprintf(stderr, "%s", prompt); }else { wait(&st); fprintf(stderr, "%s", prompt); } } } return 0; } パイプ部分が作れません・・・。 どうすればいいですか?

  • プログラム問題(1)

    以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログラムを作成するプログラム。  例 入力 1868  出力 明治元年       2007     平成19年 【自分でやったプログラム】 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define streq(a, b) !strcmp((a), (b)) const char *get_era(int); const char *get_era_name(int); int get_era_year(int); void test_get_era(void); int main(int argc, char *argv[]) { int year; char *endptr; const char *era; test_get_era(); if (argc < 2) { fprintf(stderr, "引数を入力してください。\n"); exit(1); } year = (int) strtol(argv[1], &endptr, 0); if (*endptr != '\0') { fprintf(stderr, "数値を入力してください。\n"); exit(1); } era = get_era(year); if (era == NULL) { fprintf(stderr, "西暦を入力してください。(1868-2007)\n"); exit(1); } printf("%s\n", era); return 0; } const char * get_era(int year) { static char buf[256]; int era_year = get_era_year(year); const char *era_name = get_era_name(year); if (era_year == -1) { return NULL; } if (era_year == 1) { sprintf(buf, "%s%s", era_name, "元年"); } else { sprintf(buf, "%s%d%s", era_name, era_year, "年"); } return buf; } int get_era_year(int year) { if (1868 <= year && year <= 1911) { return year - 1867; } if (1912 <= year && year <= 1925) { return year - 1911; } if (1926 <= year && year <= 1988) { return year - 1925; } if (1989 <= year && year <= 2007) { return year - 1988; } return -1; } const char * get_era_name(int year) { if (1868 <= year && year <= 1911) { return "明治"; } if (1912 <= year && year <= 1925) { return "大正"; } if (1926 <= year && year <= 1988) { return "昭和"; } if (1989 <= year && year <= 2007) { return "平成"; } return NULL; } void test_get_era(void) { /* 無効 */ assert(get_era(1867) == NULL); assert(get_era(2008) == NULL); /* 明治 */ assert(streq(get_era(1868), "明治元年")); assert(streq(get_era(1869), "明治2年")); assert(streq(get_era(1911), "明治44年")); /* 大正 */ assert(streq(get_era(1912), "大正元年")); assert(streq(get_era(1913), "大正2年")); assert(streq(get_era(1925), "大正14年")); /* 昭和 */ assert(streq(get_era(1926), "昭和元年")); assert(streq(get_era(1927), "昭和2年")); assert(streq(get_era(1988), "昭和63年")); /* 平成 */ assert(streq(get_era(1989), "平成元年")); assert(streq(get_era(1990), "平成2年")); assert(streq(get_era(2007), "平成19年")); }

  • プログラムのことについてご質問します。

    プログラムのことについてご質問します。 先日から以下のプログラムのことについて悩んでいます。 #include<stdio.h> #include<math.h> int main(int argc,char *argv[]){ FILE *rfp; FILE *wfp; int nline = 0; double score[100]; double sum_score = 0; char name[100][256]; int i; double heikinn; double hensati[100]; double ga[100]; double g[100]; double gg=0; double d=0; if (argc != 3){ fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]); return -1; } if ((rfp=fopen(argv[1],"r")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[1]); return -1; } if ((wfp=fopen(argv[1],"w")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[2]); return -1; } while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){ sum_score += score[nline]; nline ++; } heikinn=sum_score/nline; for (i=0; i<=nline; i++){ ga[i]=(score[i]-heikinn); g[i] = ga[i]*ga[i]; gg += g[i]; } for (i=0; i<=nline; i++){ d= gg/(nline-1); hensati[i]=10*ga[i]/sqrt(d)+50; } for(i=0; i<=nline; i++){ fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]); } fclose(wfp); fclose(rfp); return 0; } エラーは、出ないのですがプログラムが完了できません。 皆様のお力をおかりできないでしょうか? よろしくお願いします。

  • C言語の質問です

    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } このプログラムをグレースケール化のプログラムに修正してください お願いします

  • sys/types.hの必要性について

    #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> int main (int argc,char *argv[]) { struct stat buf[2],*p;     if(argc!=3) { fprintf(stderr,"Usage:newer file1 file2\n"); exit(EXIT_FAILURE); } p=buf; if(stat(argv[1],p)<0) { perror("stat"); exit(EXIT_FAILURE); } p++; if(stat(argv[2],p)<0) { perror("stat"); exit(EXIT_FAILURE); } if(buf[0].st_mtime>buf[1].st_mtime) { printf("%s\n",argv[1]); } else { printf("%s\n",argv[2]); } return EXIT_SUCCESS; } 上記のプログラムでは<sys/types.h>を使っていますが、 どこの部分で必要になるのでしょうか? プログラム貼り付けて非常に見づらくてすいません

  • 動かないです

    おかしなところが有ったらアドバイス・修正等お願いします。 うしろ3行を表示させたいです。 0~2行の場合はその分だけ表示させたいです。 # include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) { char *buf = NULL; int size = 0; int oldsize; do { oldsize = size; size = size * 2 + 80; buf = realloc(buf, size + 1); if(!buf) { fprintf(stderr, "memory allocation failed\n"); exit(1); } if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) if(oldsize) break; else { free(buf); return NULL; } }while(strlen(buf + oldsize) == size - oldsize); return buf; } void scan(char **lines, int n_lines) { char *p; int i; for(i = 0; i < n_lines; i++) lines[i] = NULL; while(p = getline()) { free(lines[0]); for(i = 0; i < n_lines - 1; i++) lines[i] = lines[i+1]; lines[n_lines - 1] = p; } } void print(char **lines, int n_lines) { int i; for(i = 0; i < n_lines; i++) if(lines[i]) fputs(lines[i], stdout); } int main(void) { char *lines[3]; int i; scan(lines, 3); print(lines, 3); for(i = 0; i < 3; i++) free(lines[i]); return 0; }

  • プログラムのことについてご質問します。

    プログラムのことについてご質問します。 先日から以下のプログラムのことについて悩んでいます。 このプログラムは、テキストファイル(内容は「名前,成績」)を読み込んで、テキストファイル(内容は「名前,成績,偏差値」)を書きだすというものなのです。てか、そのつもりで作りました。 コンパイルの時は、エラーが出ないのですが、いざ起動してみると、プログラムが終了せず、書き出しも行われません。 #include<stdio.h> #include<math.h> int main(int argc,char *argv[]){ FILE *rfp; FILE *wfp; int nline = 0; double score[100]; double sum_score = 0; char name[100][256]; int i; double heikinn; double hensati[100]; double ga[100]; double g[100]; double gg=0; double d=0; if (argc != 3){ fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]); return -1; } if ((rfp=fopen(argv[1],"r")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[1]); return -1; } if ((wfp=fopen(argv[1],"w")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[2]); return -1; } while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){ sum_score += score[nline]; nline ++; } heikinn=sum_score/nline; for (i=0; i<=nline; i++){ ga[i]=(score[i]-heikinn); g[i] = ga[i]*ga[i]; gg += g[i]; } for (i=0; i<=nline; i++){ d= gg/(nline-1); hensati[i]=10*ga[i]/sqrt(d)+50; } for(i=0; i<=nline; i++){ fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]); } fclose(wfp); fclose(rfp); return 0; } 皆様のお力をおかりできないでしょうか? よろしくお願いします。