あなたの問題はおそらくここにあります:
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、プログラムは意図したとおりに動作します。