Первый случай неопределенного поведения в вашем коде -
char** entree_util;
entree_util[0]="none";
entree_util
- неинициализированный указатель.
Вам, вероятно, следует изменить структуру вашего цикла:
char** entree_util;
while (1)
{
write(1, accueil, strlen(accueil)); // note: sizeof (char) is 1 by definition
entree_util = lis_ligne();
if (we_are_finished(entree_util)) {
break;
}
...
}
Обратите внимание, что entree_util[0] != "^D"
не имеет смысла как условие; вы не сравниваете строки здесь, вы сравниваете указатели. Правильное условие зависит от того, что возвращает lis_ligne
, что вы не показали.
В качестве альтернативы вы можете переместить логику для запроса пользователя и чтения строки в отдельную вспомогательную функцию:
char **lis_ligne_avec_invite_de_commande(const char *accueil) {
write(1, accueil, strlen(accueil));
return lis_ligne();
}
, а затем используйте его так:
char** entree_util;
while (!we_are_finished(entree_util = lis_ligne_avec_invite_de_commande("Veuillez entrer votre commande\n"))
{
...
}