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にするしか手はないのでしょうか?
どうかよろしくお願いします。
お礼
ありがとうございます! \nを取り除いたところ、上手く動作しました。 改行はいらないのですね>< 素早い回答、助かりました。