C言語のリスト操作プログラムの実行結果についての質問

このQ&Aのポイント
  • C言語のリスト操作プログラムを実行すると、コマンドを入力していないのに「正しいコマンドを入力してください」というメッセージが挟まれることがあります。
  • この問題の解決方法として、switch文をif文に変更する方法があります。
  • 具体的な原因は不明ですが、C言語の仕様やコンパイラの挙動に関連する可能性があります。
回答を見る
  • ベストアンサー

switchとwhile(1)、scanf()を組み合わせてプログラミングしたのですが

C言語のリストの学習用に、次のようなプログラムを作成しました。 コマンドを入力することでリストを操作するプログラムです。 #include <stdio.h> #include <stdlib.h> typedef struct cell{ int data; struct cell *next; } CELL; CELL head; /* ダミーのセル */ void InsertCell(int x) /* 新しいセルの挿入用関数:iで出る */ { CELL *p, *new; new = (CELL *)malloc(sizeof(CELL)); new->data = x; for(p = &head ; p->next !=NULL ; p = p->next){ if(new->data < (p->next)->data) { new->next = p->next; p->next = new; return; } // xがすでにリストにあるとき、何もせず終了 else if(new->data == (p->next)->data) return; } new->next = NULL; p->next = new; } void Help() /* ヘルプ:hで出る */ { printf("コマンド説明\n"); printf("i : データを挿入\n"); printf("d : データを削除\n"); printf("p : リストを表示\n"); printf("x : プログラム終了\n"); } void PrintList() /* 画面表示用関数:pで出る */ { CELL *p; for(p = &head ; p->next !=NULL ; p = p->next){ printf("%d", (p->next)->data); printf("\n"); } } void DeleteCell(int x) /* 消去用関数:dで出る */ { CELL *p, *tmp; for(p = &head ; p->next !=NULL ; p = p->next){ if((p->next)->data == x) { tmp->next = p->next; p->next = (p->next)->next; free(tmp->next); return; } } printf("そのような数字はありません\n"); } int main(void) { int x; char s; printf("コマンドのヘルプはhを入力してください\n"); while(1){ printf("コマンドを入力してください(i,d,p,x):"); scanf("%c",&s); switch(s) { case 'i': printf("整数を入力してください:"); scanf("%d", &x); InsertCell(x); break; case 'd': printf("整数を入力してください:"); scanf("%d", &x); DeleteCell(x); break; case 'p': PrintList(); break; case 'h': Help(); break; case 'x': printf("終了します"); exit(1); break; default : printf("正しいコマンドを入力してください\n"); break; } } return 0; } これをBorland C++コンパイラでコンパイルしたのち実行すると、 コマンドのヘルプはhを入力してください コマンドを入力してください(i,d,p,x):i 整数を入力してください:10 コマンドを入力してください(i,d,p,x):正しいコマンドを入力してください コマンドを入力してください(i,d,p,x):i 整数を入力してください:100 コマンドを入力してください(i,d,p,x):正しいコマンドを入力してください コマンドを入力してください(i,d,p,x):d 整数を入力してください:10 コマンドを入力してください(i,d,p,x):正しいコマンドを入力してください コマンドを入力してください(i,d,p,x):p 100 コマンドを入力してください(i,d,p,x):正しいコマンドを入力してください コマンドを入力してください(i,d,p,x):x 終了します となり、何故かコマンドも特に入力していないのに 『コマンドを入力してください(i,d,p,x):正しいコマンドを入力してください』 の一文が挟まれます。 これはどういう事でしょうか。解決するにはswitch文をifにするしか手はないのでしょうか? どうかよろしくお願いします。

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

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

>scanf("%c",&s); scanf(" %c",&s); のように、%c の直前に空白を入れるのがいちばん簡単な方法かな、と思います。

runkiri
質問者

お礼

ありがとうございました、動作しました。 お答えを貰って検索したところ改行が読み込まれてしまうという事を理解しました。

関連するQ&A

  • 双方向リストのバブルソートについて

    双方向リストをバブルソートを用いてソートしたいです。 下記がプログラム(一部)ですが、ソートした後にリスト表示すると 無限ループに陥ります。 どこがいけないのでしょうか。 #include <stdio.h> #include <stdlib.h> struct cell{ int data; struct cell *next, *prev; }; void insert_head(struct cell **head, int num){ struct cell *p, *p1; p = *head; p1 = make_cell(); *head = p1; p1->data = num; p1->next = p; if(p1->next != (struct cell *)NULL){ p1->next = p; p->prev = p1; } } void print_list(struct cell *head){ struct cell *p; p = head; printf("data = \n"); while(p != (struct cell *)NULL){ printf("%d\n", p->data); p = p->next; } } void sort_list(struct cell **head){ struct cell *p, *p2; int i, n; n = 0; p = *head; while(p->next != (struct cell *)NULL){ p = p->next; n++; } for(i = 0, p = *head; i < n-2; i++){ if(p->data > p->next->data){ if(p == *head){ *head = p->next; }else{ p->prev->next = p->next; } p2 = p->next; p->next = p->next->next; p->next->next = p; p->next->next->prev = p; p->next->prev = p->prev; p->prev = p2; }else p = p->next; } } int main(void){ struct cell *head = (struct cell *)NULL; int n; while(1){ printf("1:Insert head 2:Insert tail 3:Delete 4:List 5:Sort 6:Exit\n"); scanf("%d", &n); switch(n){ case 1: printf("num = "); scanf("%d", &n); insert_head(&head, n); break; case 2: printf("num = "); scanf("%d", &n); insert_tail(&head, n); break; case 3: printf("num = "); scanf("%d", &n); delete_cell(&head, n); break; case 4: print_list(head); break; case 5: sort_list(&head); break; case 6: return 0; break; } } }

  • プログラミング

    ランダムの数値を入力してその数値より大きければ正解より大きいと表示して小さければ小さいと表示し正解なら正解ともだすプログラムをつくっています 正解まで何回かかったかとも表示したいと思います 上手く実行できないのでご教授ください #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int i,x,y; srand((unsigned int)time(NULL)); printf("%\n",i); i=rand()%100; //0以上100以下の整数を生成 y=0; printf("1以上100以下の整数を入力してください。\n"); scanf( "%d", &x ); /* 数値を入力させる */ printf("1以上100以下の整数を入力してください。\n"); y=y+1; if( x == i ) { printf("%d回目で当たりました。\n",y); printf("%d回目で当たりました。\n",y); break; /* 無限ループ */ } else{ if ( x < i ) //printf("正解より大きいです。\n"); printf("正解より大きいです。\n"); else //printf("正解より小さいです。\n"); printf("正解より小さいです。\n"); } } //return0;

  • switch文とscanfについて

    ソースコード------------------------------------- #include <stdio.h> void main(){ int i; char s, ch; while(1){ printf("Input 1 or 2\n"); scanf("%c", &s); switch(s){ case '1' : printf("Input a number\n"); scanf("%d", &i); printf("You input '%d'\n", i); break; case '2' : printf("Input a character\n"); scanf("%c", &ch); printf("You input '%c'\n", ch); break; } } } ----------------------------------------------- 実行例----------------------------------------- Input 1 or 2 1 Input a number 4 You input '4' Input 1 or 2 Input 1 or 2 //------(1) 2 Input a character You input ' //------(2) ' Input 1 or 2 ----------------------------------------------- (1)について。 なぜ"Input 1 or 2"が二回繰り返されているのですか。 (2)について。 scanfが呼び出されて入力待ちになることを期待しているのですが、 なぜ(2)のようになってしまうのでしょうか。

  • リスト構造のプログラミング

    #include<stdio.h> #include<stdlib.h> typedef struct number{ float x; struct number *next; }Num; void append_list(Num **, float); int main(void) { Num *start,*p; float i,d; start=NULL; for(i=0.0;i<10.0;i++){ append_list(&start,i); } p=start; while(p!=NULL){ printf("%f\n",p->x); p=p->next; } p=start; while(p !=NULL){ Num *q; q=p; p=p->next; free(q); } return 0; } void append_list(Num **s, float n) { Num *end, *new; if(*s==NULL){ *s=(Num *)malloc(sizeof(Num)*1); (*s)->x=n; (*s)->next=NULL; return; }end=(*s); while(end->next !=NULL){ end=end->next; } new=(Num *)malloc(sizeof(Num)*1); new->x=n; new->next=NULL; end->next=new; } 0~9までの数値を順番に追加してリスト構造のデータ構造で 保存するプログラミングを作ったのですが、これにキーボード から入力した1つの実数(0~9)を数値の順序を乱さないよう にその数値を持つ要素を追加するにはどうすればよいのでしょうか?

  • 連結リストによるデータ管理プログラムの解説

    ★から★までのプログラムが、各行ごとにどのような動きをしているのか簡潔な言葉で説明を書いていただきたいのです。必要がないと判断した行はとばして下さって構いません。 (例) printf("hello!"); …hello!と表示 if(a==0){ …aが0なら #include <stdio.h> #include <stdlib.h> struct CELL{ struct CELL *next; char data; }; /* Head CELL CELL CELL +-------+ +-------+ +-------+ +-------+ | ? | *----> | 5 | *----> | 6 | *----> | 8 | / | +-------+ +-------+ +-------+ +-------+ */ main(void){★ struct CELL head; struct CELL *p, *wp; char a; head.next=NULL; printf("?\n"); scanf("%c %*c",&a); while(a!='0'){ printf("mode?\n"); scanf("%c",&mode); if(mode=="a"){ p=&head; while(p->next!=NULL){ p=p->next; } wp=(struct CELL *)malloc(sizeof(struct CELL)); if(wp==NULL){ printf("cannot allocate enough memory.\n"); return 0; } p->next=wp; p->next->data=a; p->next->next=NULL; printf("?\n"); scanf("%c %*c",&a); } if(mode=="p"){ printf("\n\nNow...\n"); p=&head; while(p->next!=NULL){ printf("%c --> \n",p->next->data); p=p->next; } printf("NULL\n"); if(mode=="d"){ p=&head; while(p->next->data==a){ p=p->next; } if(p==NULL) break; wp=p->next->next; while(p->next->data==a) p=wp;★ } } return 0; }

  • C言語 スタックを使ったプログラミングについて

    C言語のスタックを使った逆ポーランド記法を使ったプログラミングについて質問です。 今回作ったプログラムは、キーボードで入力した逆ポーランド記法の数式を計算してその結果を出力するといったものです。 実際に以下のプログラムをcygwin上で動かしてみたのですが、コアダンプ表示が出てうまく動作しませんでした。 一応printfなどを使って確認してみたところ。main関数までは辿り着いているみたいなのですが、スタックを使うあたりから怪しくなっているみたいでよくわかりませんでした。。 どこが間違っているのかわかりやすく教えていただけると大変助かります。 長々とすみません、よろしくお願いいたします。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> typedef struct cell_{ double vall; struct cell_ *next; }cell; cell *sp = NULL; int empty(void){ cell *retnode = sp -> next; if(retnode == NULL){ return 1; } return 0; } void push(double x){ cell *newnode; newnode = (cell*)malloc(sizeof(cell)); newnode -> vall = x; newnode -> next = sp -> next; sp -> next = newnode; } double pop(void){ int i; double num; i = empty(); if(i == 1) exit(1); cell *shownode = sp -> next; num = shownode -> vall; sp -> next = shownode -> next; free(shownode); return num; } double print(void){ cell *printnode = sp -> next; return printnode -> vall; } int main(){ double a, b; double i; char c; char *ends; while((c = getchar()) != EOF){ if(isdigit(c)){ a = c; push(a); }else{ switch(c){ case '+': a = pop(); b = pop(); i = a + b; push(i); break; case '-': a = pop(); b = pop(); i = a - b; push(i); break; case '*': a = pop(); b = pop(); i = a * b; push(i); break; case '/': a = pop(); b = pop(); i = a / b; push(i); break; case EOF || '\n': a = print(); printf("%f\n", a); default: printf("Irregular character is found. Try again\n"); while((c = getchar()) != EOF && c != '\n'){} break; } } } return 0; }

  • c言語 プログラミング

    以下のプログラムで分からないところがあります。 数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号) 答えを表示するというプログラムなのですが、 5行目と9行目にある”-'0'”の意味が分からないので教えてください。 01: int x=0,y=0,z,i;char a[30],p; 02: printf("式を入力してください。:);gets(a); 03: for(i=0;a[i];i++) 04:  if('0'<=a[i] && a[i]<='9') 05:   x=10*x+a[i]-'0'; 06:  else{p=a[i]-'0';break;} 07: for(i++;a[i];i++) 08:  if('0'<=a[i] && a[i]<='9') 09:   y=10*y+a[i]-'0'; 010: switch(p){ 11:  case '+':z=x+y;break; 12:  case '-':z=x+y;break; 13:  case '*':z=x*y;break; 14:  case '/':z=x/y;break; 15:  default:puts("入力エラーです。");return 0; 16: } 17: printf("%d%c%d=%d\n",x,p,y,z); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • プログラミング合っているか教えて下さい。

    5つの整数をキーボードから入力し、合計値と平均値を出すプログラミングです。 (1)キーボードからの数値入力は「Enter 1st=○」のように表記。 (2)平均値は小数第二位まで表示。 (3)ループ文を使用する事。 #include<stidio.h> main() { int a sum=0; printf("データを5つ入力せよ\n"); scanf( %d",&a); switch(a) { case 1: printf("Enter 1st=%d",a); break; case 2: printf("Enter 2nd=%d",a); break; case 3: printf("Enter 3rd=%d",a); break; case 4: printf("Enter 4th=%d",a); break;   case 5: printf("Entre 5th=%d,a); break; } for (i=1;i<5;i++) {scanf("%d",&a; sum=sum+a;} printf("5つの合計値=%d",sum); printf("5つの平均値=%4.2f",(float)sum/5); } まだ初心者で勉強中のため、文法がおかしいかもしれませんが間違い等のご指摘、宜しくお願いします。

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

専門家に質問してみよう