あなたの問題はおそらくここにあります:
char *ch=malloc(sizeof("50");
まず、閉じ括弧が 1 つありません。しかし、これが実際のコードではなく、質問を投稿する際のタイプミスであると仮定すると、より深い問題があります。
"50"
二重引用符内は文字列リテラルです。を文字列リテラルにsizeof()
適用すると、文字列内の文字数が取得されますNUL
。したがって、 では 3 文字分のスペースしか割り当てていませんch
。
入力しようとするとscanf()
、3 文字の buffer の末尾を超えて書き込んでいますch
。省略してsizeof()
、単に次のように言います。
char* ch = malloc (50);
また、スキャン セットは先頭の空白をスキップ%[^\n]
しません。最初scanf()
は改行で停止し、バッファに残ります。ループ内の後続scanf()
の呼び出しは、while
その改行文字に遭遇し、スキャン セットから除外されるため、忠実に停止します。したがって、ループ条件
while (strcmp (ch, "exit"))
true になることはなく、無限ループが発生します。scanf()
この問題を回避するには、 の後に改行を使用します。
scanf ("%[^\n]%*c", ch);
%*c
「文字を読み取ってから破棄する」という意味です。そのため、バッファに残っている を読み取り、\n
どこにも保存しません。したがって、 nextscanf()
はバッファの先頭で a に遭遇せず\n
、プログラムは意図したとおりに動作します。