Я написал эту мини-скорлупу, но я не уверен, что делаю правильный контроль над ошибками. Я знаю, что fgets может возвращать feof и ferror (http://www.manpagez.com/man/3/fgets/) , но я не знаю, как их использовать.Как использовать feof и ferror для fgets (minishell in C)
Я проверил, возвращает ли fgets нулевой указатель (который указывает, что содержимое буфера inditerminate), но я хотел бы знать, как использовать feof и ferror.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define LINE_LEN 50
#define MAX_PARTS 50
int main()
{
char* token;
char str[LINE_LEN];
char* arr[MAX_PARTS];
int i,j;
bool go_on = true;
while (go_on == true){
printf("Write a line:('quit' to end) \n $:");
fgets(str, LINE_LEN, stdin);
if (str==NULL) {
goto errorfgets;
} else {
size_t l=strlen(str);
if(l && str[l-1]=='\n')
str[l-1]=0;
i=0;
/* split string into words*/
token = strtok(str, " \t\r\n");
while(token != NULL)
{
arr[i] = token;
i++;
token = strtok(NULL," \t\r\n");
}
fflush(stdin);
/* check if the first word is quit*/
if (strcmp(arr[0],"quit")==0)
{
printf("Goodbye\n");
go_on = false;
} else {
for (j=0; j < i; j++){
printf("'%s'\n", arr[j]);
}
}
}
}
return 0;
errorfgets:
printf("fgets didn't work correctly");
return -1;
}
НЕ используйте goto! –
@Digital_Reality: одна разумная ситуация для использования 'goto' - обработка ошибок. –
@MichaelBurr, который можно обработать, вызвав некоторую функцию очистки. Не так ли? –