• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラミング言語Cの演習の質問)

C言語の演習で単語数がnのものがいくつあるかを表示するプログラムが上手くいかない理由

このQ&Aのポイント
  • C言語の演習で単語数がnのものがいくつあるかを表示するプログラムが上手くいかない理由を教えてください。
  • 質問者はプログラミング言語Cの演習で、単語数がnのものがいくつあるかを表示するプログラムを作成しましたが、上手くいかない状況です。なぜ上手くいかないのか、教えていただきたいです。
  • C言語の演習で単語数がnのものがいくつあるかを表示するプログラムを作成したのですが、うまく動作しません。どうすれば正しく動作するようになるのか、教えてください。

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

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

一番重大な問題は、while文の中で使っているiの値が、直前のfor文でi=10に達した状態のままになっている事。 従って、大抵の場合には、最初の単語の長さは、期待した配列位置ではなく、len[十幾つか]の場所をアクセスしてしまう。 whileの直前にi=0;を入れてみましょう。 あとは、リターンコードや、ピリオドなども考慮するといいでしょう。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

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

直接は関係無いけど > main() こんなmain関数を使っている教科書だったら、新しいのに買い替えましょう。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>単語数がnのものがいくつあるか 意味がよくわかりません。 入力と出力の例を示してください。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

やりたいのはこんな感じ?↓ 入力した文章をスペースおきに単語を分けて、それぞれの文字数毎の単語数を集計するプログラム。 #define COUNTOF( a ) ( sizeof( a ) / sizeof( a[ 0 ] ) ) int main() {   int count[ 100 ] = { 0 };   char buffer[ 256 ];   int ii = 0;   /* 文章を入力 */   for( ii = 0;      ii < ( sizeof( buffer ) - 1 );      ii++ )   {     int ch = getchar();     if( EOF == ch || '\n' == ch )     {       break;     }     buffer[ ii ] = ( char )ch;   }   buffer[ ii ] = '\0';   /* 入力した文章を単語毎に分ける */   char* token = strtok( buffer, " " );   while( token )   {     /* 単語の文字数 */     int length = strlen( token );     /* 該当する文字数の個数をカウント */     if( 1 <= length &&       COUNTOF( count ) >= length )     {       ++( count[ length - 1 ] );     }     token = strtok( NULL, " " );   }   /* 文字数毎の個数を表示する */   for( ii = 0; ii < COUNTOF( count ); ii++ )   {     if( 0 < count[ ii ] )       printf( "文字数が%dの単語は%d個です\n",           ii + 1, count[ ii ] );   }   return 0; }

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>上手くいけません。何故でしょうか、教えていただきたいです。 まず「なにが」上手くくいけないですか? コンパイル(ビルド)できない? 実行すると暴走(OSにより止められる)する? >main() >{ 戻り値の型、引数などが未設定です。 コンパイラによってはエラーになります。 >while((c=getchar()) != EOF){ > if(c != ' '){ >  ++i; > } > else{ >  ++len[i]; >  i = 0; > } >} 10文字以上入力した後で空白を入力すると、意図しないまま終了し(OSが止めてくれ)ます。 # OSによっては吹っ飛びますが… iがlen[]の範囲を超えます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 プログラミング 文字列

    C言語のプログラミングについての質問です。 文字列を入力して、それを逆順に表示するというプログラムを作っているのですが、 どうしても上手くいきません。 どこか間違えているのかわかりません。 わかる方いらっしゃいましたらご回答お願いします。 #include <stdio.h> int main(void) { char data[100]; int i, leng; char c; leng = 0; c =getchar(); while((c != '\n') && (c != EOF)) { data[leng] = c; leng = leng + 1; c = getchar(); } printf("%c", data[c]); return 0; }

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • うまくいかないorz

    出てきたアルファベットをカウントするプログラムを作成したのですが、 うまくいきません。 #include<stdio.h> int main(void) { int kaisu[25]={0}; char c; int i; do{ i=(c=getchar())-'a'; //printf("%d\n",i); kaisu[i]++; }while(c=(getchar())!=EOF); for(i=0;i>=25;i++){ printf("%d\n",kaisu[i]); } return(0); } 一応、EOFで読み込みを終了させたいのですが。 ご伝授ください。

  • C言語のことについて教えてください

    C言語のことで教えてください。お願いします #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <windows.h> int main(int argc, char* argv[]) { char *data[] = {"おひつじ","おうし","ふたご","かに","しし","おとめ","てんびん", "さそり","いて","やぎ","みずがめ","うお"}; int data_len = 12; //データの数 char input[10]; //プレイヤーの入力値 int i,p,start; int win = 1; int mawari = 1; //内回りの場合は1 int p_turn = 0; //プレイヤーのターン if ((argc > 1) && (strcmp(argv[1], "-soto") == 0)) { mawari = 0; } srand(time(NULL)); start = rand()%data_len; printf("古今東西山手線ゲ~ム!\n"); printf("お題:星座の名前\n"); for(p = start,i = 1; i<= data_len; i++,p_turn = !p_turn ) { sleep(500); if(p_turn == 0) {printf("コンピューター");} else if (p_turn == 1) {printf("プレイヤー");} sleep(500); printf("ちゃん! >"); if(p_turn == 0) { printf("%s\n",*(data+p)); } else { scanf("%s", input); while (getchar() != '\n') { } if(strcmp(*(data+p),input) != 0) { win = 0; break; } } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } if(win == 1) {printf("あなたの勝ち");} else {printf("あなたの負け");} return 0; } なんですが、どうしても } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } 変数Pに今は乱数1-12がはいっているのに、なぜこの処理を行うかがわかりません。どうしてなんですか?教えてください。

  • C言語  九九表

    九九表を作ろうとしたのですが、うまくいきません、解説お願いします。 #include<stdio.h> main() { int i ; int j ; for( i=1 ; i<=10 ; i++){ for( j = 1 ; j<=10 ; j++) { printf("%4d\n") , i*j ; } printf("\n") ; } } 結果 10 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832     が10個続いてました・・・・

  • 2つのプログラムの違い

    どうしても分からなかったので投稿しました。よろしくお願いします。 #include<stdio.h> int main(void) { int c; while((c=getchar())!=EOF){ putchar(c); } return 0; } のプログラムをコマンドプロンプトで入力すると、 abc abc なんですが、 #include<stdio.h> int main(void) { int c,i; i=0; while ((c=getchar())!=EOF) { putchar(c); i++; printf("%d\n",i); } return 0; } の場合、 abc a1 a2 a3 4 になります。 自分は abc a1 a2 a3 になると思ったのですが、a3と4の隙間と4は何故出て来たのでしょうか?