• ベストアンサー

コンパイルエラー

前に質問したものですが、ちょっとソースをいじりました。 ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 コンパイルできて実行できました。 でもエンキューとデキューが実行されてません。 次のソースのうちどこを変えたらいいか教えてください #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[NUMBER]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],q->que[q->front++]); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); }

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

/*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char *que[NUMBER]; /* キューへのポインタ */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { int i; q->num = q->front = q->rear = 0; if (max > NUMBER) { q->max = 0; return (-1); } for (i = 0; i < max; i++) { if ((q->que[i] = calloc(20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { int i; for (i = 0; i < q->max; i++) { if (q->que[i] != NULL) { free(q->que[i]); // 配列を解放 q->que[i] = NULL; } } q->max = q->num = q->front = q->rear = 0; } 私ならこうします

hiro3932
質問者

お礼

プログラムソースありがとうございます。 /*--- キューの初期化 ---*/の部分とか違いますね。 参考にします。 どうも。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

投稿のタイトルは「コンパイルエラー」ですね。 > コンパイルできて実行できました。 矛盾してますよ。

hiro3932
質問者

お礼

すみません。 間違えてしまいました…。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

QueueAlloc の calloc は論理的に間違ってます. 「20」という値はどこから出てきましたか? もちろん「論理的に間違っている」だけなのでプログラムの動作に影響しないこともありますが, 影響が出るようだと「原因を非常に特定しにくい」やっかいなバグです.

hiro3932
質問者

お礼

回答ありがとうございます。 確かになんで20って数字が出てきたんだろう・・・ 直してみます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

printf("デキューしたデータは%d。\n", &buffer[0]); は printf("デキューしたデータは%s。\n", &buffer[0]); でしょうね

hiro3932
質問者

お礼

回答ありがとうございます。 初歩的なミスを… おかげでちゃんと実行できました。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.1

具体的にはどう動くんですか?

hiro3932
質問者

お礼

実行結果はこんな感じです。 現在のデータ数:0/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Tom 75 60 現在のデータ数:1/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Jerry 85 90 現在のデータ数:2/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Spike 45 30 現在のデータ数:3/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Rachel 55 85 現在のデータ数:4/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Monica 75 90 現在のデータ数:5/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Phoebe 80 75 現在のデータ数:6/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Chandler 70 65 現在のデータ数:7/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはTom 75 60 。 現在のデータ数:6/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはJerry 85 90 。 現在のデータ数:5/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはSpike 45 30 。 現在のデータ数:4/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはRachel 55 85 。 現在のデータ数:3/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはMonica 75 90 。 現在のデータ数:2/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはPhoebe 80 75 。 現在のデータ数:1/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはChandler 70 65 。 現在のデータ数:0/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューできません。

関連するQ&A

  • キゅー

    ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 もう少しで完成なんですがちょっとエラーでます。 次のソースのうちどこを変えたらいいか教えてください プラグラム #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[100]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer)) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer)) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],que[q->front++); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } if(j>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } j++; printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); } 多分int QueueEnque(Queue *q, char *buffer))と int QueueDeque(Queue *q, char *buffer))の()の中が適切じゃないかも。宣言構文のエラーと出るので。

  • エンキューとデキューの操作関数

    エンキューとデキューの操作関数なのですが、 どのような考え方なのかがいまいちわからず困っています。 どなたか解説お願いします。 int QueueEnque(Queue *q, int x) { if(q->num >= q->max){ return (-1); }else{ q->num++; q->que[q->front++] = x; if(q->front == q->max){ q->front =0; } if(q->num ==1){ q->rear--; if(q->rear == -1){ q->rear = q->max-1; } } return (0); } } int QueueDeque(Queue *q, int *x) { if(q->num <= 0){ return (-1); }else{ q->num--; q->rear++; if(q->rear == q->max){ q->rear =0; } *x = q->que[q->rear]; if(q->num ==0){ q->front =q->rear; } return (0); } } キューを実現する構造体がこのようになっています。 typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ int *que; /* キュー(の先頭要素へのポインタ) */ } Queue;

  • C言語 キューのキーボード操作

    (表示するプログラムであるprint_queue_mtrxは分割されています) 以下のプログラムのswitchによるキーボード操作部分について質問します。 このプログラムは「キーボード」による文字入力を行った場合はswitchがちゃんと機能し、キーボードの操作(0,1,他)を加えることができますが、  リダイレクションでファイル(data.dat)の中の文字列を読みこませた場合、switchが機能することなく、終了します。(キューが機能するのみ) data.datの中は一行の英字文字列、例えば「TOKYO」のようなものです。 これをリダイレクション(queue < data.dat)で機能どのように記述すればいいでしょうか。 #include <stdio.h> #include <stdlib.h> #define MAX 100 void print_queue_mtrx( char *q, int top, int rear ); /* top == rear ならばキューは空 キューの値は,top/rearの値が増える方向に積まれていく */ void enqtoQueue( char ch ); char deqfromQueue(); char peekofQueue(); void initializeQueue(); char queue[ MAX ]; int top = 0; int rear = 0; void enqtoQueue( char ch ) { if ( MAX <= rear ) { fprintf( stderr, "Queue Overflow!!\n" ); exit( 1 ); } queue[ rear ++ ] = ch; } char deqfromQueue() { if ( ! ( top < rear ) ) { fprintf( stderr, "No data in queue!!\n" ); exit( 1 ); } return queue[ top ++ ]; } char peekofQueue() { return queue[ top ]; } void initializeQueue() { top = 0; rear = 0; } int main() { int ch; /* 1文字ずつ読み込む */ while ( ( ch = getc( stdin ) ) != EOF ) { switch( ch ) { case '\n': /* 改行コード除け :) */ break; case '0': /* 0 の場合はプログラム終了 */ exit( 0 ); break; case '1': /* 1 の場合は1文字デキューして,その文字を表示して,キューの内容を表示 */ printf( "deqfromQueue: %c\n", deqfromQueue() ); print_queue_mtrx( queue, top, rear ); break; default: /* それ以外の場合は1文字エンキューして,キューの内容を表示 */ enqtoQueue( ch ); print_queue_mtrx( queue, top, rear ); break; } } return 0; }

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが上手くいかずに添付されている写真の実行結果通りになりません。なのでよければ解答をお願いします

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが関数print_queueは出来ましたが関数queueの中身がわかりませんので良ければ解答をお願いします。 自分が書いた関数print_queueは下に置いておきます 実行結果は数字以外は画像の通りになります。 void print_queue(Queue *queue) { if (queue->front == queue->rear) { printf("queue is empty\n"); } else { for (int i = queue->front; i % MAX_QUEUE_LENGTH != queue->rear; i++) { printf("queue[%2d]: %2d\n", i % MAX_QUEUE_LENGTH, } } }

  • プログラムについて

    今スタっクのファイルから読み込んだ文字列をスタっクへプっシュしたりポっプしたりする過程がわかるプログラムを作ってます 。 作りかけのプログラムですがどこをどうすればいいか教えてください!! 一応コンパイルできます。 使ってない関数があるかもしれません。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックのサイズ */ int ptr; /* スタックポインタ */ char *stk; /* スタック(の先頭要素へのポインタ) */ } Stack; /*--- スタックの初期化 ---*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の確保に失敗 */ return (-1); } s->max = max; return (0); } /*--- スタックの後始末 ---*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*--- スタックにデータをプッシュ ---*/ int StackPush(Stack *s, int x, int i,char *a[]) { if (s->ptr >= s->max) return (-1); if(x>=i) { puts("プッシュできる文字データはありません。"); return (-1); } strcpy(&s->stk[s->ptr++],&(*a)[x]); x++; return x; } /*--- スタックからデータをポップ ---*/ int StackPop(Stack *s, int x,char *a[]) { if (s->ptr <= 0) /* スタックは空 */ return (-1); strcpy(&s->stk[--s->ptr],&(*a)[x]); return (0); } /*--- スタックからデータをピーク ---*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*--- スタックの大きさ ---*/ int StackSize(const Stack *s) { return (s->max); } /*--- スタックに積まれているデータ数 ---*/ int StackNo(const Stack *s) { return (s->ptr); } /*--- スタックは空か ---*/ int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } /*--- スタックは満杯か ---*/ int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } /*--- スタックを空にする ---*/ void StackClear(Stack *s) { s->ptr = 0; } int main(void) { int i=0,j,ret,x=0; char *a[NUMBER]; char buffer[20]; FILE *fpin; Stack s; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } strcpy(&a[i][0],&buffer[0]); /*ret=sscanf(&buffer[0],"%s",&a[i][0]); //データ文字列を3分割 if(ret!=1) //1に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; }*/ i++; } for(j=0; j<i; j++) printf("%s\n",&(*a)[j]); if (StackAlloc(&s, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m; printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: printf("データ:"); puts("こんちくしょ~"); if(StackPush(&s, x,i,&(*a)) == -1) puts("スタックへのプッシュに失敗しました。"); break; case 2: if(StackPop(&s, x,&(*a)) == -1) puts("ポップできません。"); else printf("ポップしたデータは%sです。\n", &s.stk[s.ptr]); break; } } StackFree(&s); END: fclose(fpin); return (0); }

  • キャスト方法について

    C言語にてbase64デコード処理を行う独自の関数を作成することになり putcを使用して出力するソース(以下)はあるのですが、 charの配列にデコード結果を上手く格納することができません。 何か良い方法はありませんでしょうか? int main(int argc, char **argv, char **envp) { FILE *fpin, *fpout; int c, i = 0; unsigned char buffer[4]; if( argc < 2 ){ fpin = stdin; } if( argc < 3 ){ fpout = stdout; } else if(( fpout = fopen(argv[2],OPENMODE)) == NULL ){ return 8; } while(( c = getc(fpin) ) != EOF ){ if( c >= 'A' && c <= 'Z' ){ buffer[i++] = c - 'A'; } else if( c >= 'a' && c <= 'z' ){ buffer[i++] = c + 26 - 'a'; } else if( c >= '0' && c <= '9' ){ buffer[i++] = c + 52 - '0'; } else if( c == '+' ){ buffer[i++] = 62; } else if( c == '/' ){ buffer[i++] = 63; } if( i >= 4 || ( i >= 0 && c == '=' )){ putc( ( buffer[0] << 2 ) | ( buffer[1] >> 4 ), fpout); if( i >= 3 )putc( ( buffer[1] << 4 ) | ( buffer[2] >> 2 ), fpout); if( i >= 4 )putc( ( buffer[2] << 6 ) | buffer[3], fpout); i = 0; } } }

  • pointer

    動的なメモリの確保を行うprogramです。 #include <stdio.h> #include <string.h> #include <stdlib.h> static int _getMaxValueNum(void); static float *_allocMemory(int max_num); static float *_getIntegerValues(float *values, float *num, int max_num); static void _printIntegerValue(float *values, float num); static float _getIndex(float num); static int _getYesNo(void); int main() { float *values; int max_num; float num; max_num = _getMaxValueNum(); values = _allocMemory(max_num); values = _getIntegerValues(values, &num, max_num); _printIntegerValue(values, num); free(values); return 1; } static int _getMaxValueNum(void) { char buffer[100]; int max_num; for(;;){ printf("Seisuchi no saidaikosu -> "); scanf("%s",buffer); if(sscanf(buffer,"%d",&max_num) != 1) printf("%s : ha futona nyuryoku desu.\n",buffer); else break; } return max_num; } static float *_allocMemory(int max_num) { float *pointer; float max_ber; max_ber = max_num; pointer = (float *)malloc(sizeof(float)*max_ber); if(pointer == NULL){ printf("Memory no dotekikakuho ni shippai shimashita.\n"); exit(1); } return pointer; } static float *_getIntegerValues(float *values, float *num, int max_num) { char buffer[10]; *num = 0.0; int number float max_ber; printf("Suchi wo nyuryoku shitekudasai.\n"); printf("Syuryo suru baai niha \'q\' wo oshitekudasai.\n"); for(;;){ scanf("%s",buffer); if(sscanf(buffer,"%f",values+(*num)) != 1.0){ if(!strcmp(buffer,"q")){ break; } else{ printf("Nyuryoku ga tadashiku arimasen.\n"); continue; } } } (*num)+1.0; max_ber = max_num; if(*num >= max_ber){ values=(float*)realloc(values,sizeof(float)*((*num)+max_ber)); if(values == NULL){ printf("Memory no dotekikakuho ni shippai shimashita.\n"); exit(1); } } return values; } static void _printIntegerValue(float *values, float num){ int id; do{ id = _getIndex(num); printf("Shitei sareta index no suchi ha %f desu.\n",*(values+id)); }while(_getYesNo()); } static float _getIndex(float num) { char buffer[10]; float id; int ex; for(;;){ printf("Index wo nyuryoku shitekudasai.[0-%.0f]",num-1.0); scanf("%s",buffer); if(sscanf(buffer,"%d",&ex) != 1 || id >= num) printf("%s : ha futona nyuryoku desu.\n",buffer); else break; } id = ex; return id; } static int _getYesNo(void) { char buffer[10]; for(;;){ printf("Tsuzuke masuka?[Yes/No]"); scanf("%s",buffer); if(!strcasecmp(buffer,"YES") || !strcasecmp(buffer,"Y")) return 1; else if(!strcasecmp(buffer,"NO") || !strcasecmp(buffer,"N")) return 0; printf("%s : ha futona nyuryoku desu.\n",buffer); } } 実行したら Seisuchi no saidaikosu -> 5 Suchi wo nyuryoku shitekudasai. Syuryo suru baai niha 'q' wo oshitekudasai. 2.3 Segmentation fault (core dumped) となり #0 0x280f2dbe in __svfscanf () from /lib/libc.so.6 #1 0x280e7d24 in sscanf () from /lib/libc.so.6 #2 0x080487ff in _getIntegerValues (values=0x804a040, num=0xbfbfe7bc, max_num=5) at pointer8.c:84 #3 0x0804869f in main () at pointer8.c:31 となりました. *_getIntegerValuesの if(sscanf(buffer,"%f",values+(*num)) != 1.0){ がerror... どこがいけないのかな... 教えてください。

  • javaのコンパイルができません。

    コンパイルができません エラーの内容とソースコードは次です Microsoft Windows [Version 6.0.6002] Copyright (c) 2006 Microsoft Corporation. All rights reserved. C:\Users\j1409061\Documents\java\MeikaiJava>javac SR091409061.java SR091409061.java:7: 式の開始が不正です。 const int MAX_INT = 2147483647; ^ SR091409061.java:8: 式の開始が不正です。 const int BUFFER_SIZE = 100; ^ SR091409061.java:9: ';' がありません。 int main();{ ^ SR091409061.java:16: ']' がありません。 char buf[BUFFER_SIZE]; ^ SR091409061.java:16: 式の開始が不正です。 char buf[BUFFER_SIZE]; ^ SR091409061.java:22: 式の開始が不正です。 n = sscanf(buf, "%d %c", &data, &c); ^ SR091409061.java:22: 式の開始が不正です。 n = sscanf(buf, "%d %c", &data, &c); ^ SR091409061.java:73: 式の開始が不正です。 n = sscanf(buf+i, "%d", &data); ^ SR091409061.java:96: class、interface、または enum がありません。 } ^ エラー 9 個 C:\Users\j1409061\Documents\java\MeikaiJava> //最大値と最小値を求めよう // C:\Users\j1409061\Documents\java\MeikaiJava\SR091409061.java class SR091409061 { public static void main(String args[]) { Scanner stdIn = new Scanner(System.in); const int MAX_INT = 2147483647; const int BUFFER_SIZE = 100; int main();{ /* 変数を定義、初期化 */ int data; int max = -1; int min = MAX_INT; bool data_exist = false; int i, n; char buf[BUFFER_SIZE]; printf("Please input data : "); while(true) { /* データ(1行分読み込み) */ fgets(buf, BUFFER_SIZE, stdin); /* データ取り出しと計算 */ n = sscanf(buf, "%d %c", &data, &c); if( ( n == -1 ) || ( n == 0 ) ) { break; } else if (n == 1) { // the number of data is 1. data_exist = true; data = abs( data ); if(max < data){ /* maxを変更 */ max = data; } if(min > data){ /* minを変更 */ min = data; } } else if (n == 2) { // the number of data is larger than 2. i = 0; while (true) { data_exist = true; data = abs( data ); if(max < data){ /* maxを変更 */ max = data; } if(min > data){ /* minを変更 */ min = data; } // 空白文字を読み飛ばす while (true) { if(buf[i] == ' ') { i++; } else { break; } } // 数字(0から9)を読み飛ばす while (true) { if( ( buf[i] >= '0' ) && ( buf[i] <= '9' ) ) { i++; } else { break; } } // 行末なら終える if(buf[i] == '\n') { break; } // データ読み込み.読み込みに成功したら次の文字へ(i++), 失敗したら終える(break). n = sscanf(buf+i, "%d", &data); if(n == 0) { break; } i++; } } if(n == 0) { break; } } /* 最大値, 最小値を出力 */ if (!data_exist) { printf("No data.\n"); } else { printf("Max = %d\n",max); printf("Min = %d\n",min); } return 0; } } } } よろしくお願いします

  • このプログラムどこがおかしいですか?

    コンパイルはできますが実行できません… どこがおかしいか分かる人教えてください。 このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。 #include <stdio.h> #include <string.h> #define NUMBER 10 //構造体を宣言する struct student { //名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義 char name[10]; char math[4]; char eng[4]; }; /*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/ int search(struct student *b, int n, char key) { int i=0; b[i].name[0]=key; // 番兵を追加 while (1) { if (b[i].name[0] == key) break; /* 見つけた */ i++; } return (i == n ? -1 : i); } int main(void) { FILE *fpin; struct student a[NUMBER]; int i=0, idx,ret; char buffer[20],ky; int nx=sizeof(buffer) / sizeof(buffer[0]); fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=100) break;//読み込む人数が100人を超えてる時の処理 ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割 if(ret!=3) //3に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; } printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng); i++; } printf("探す値:"); scanf("%s", &ky); idx = search(a, nx - 1, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); END: fclose(fpin); return 0; }

専門家に質問してみよう