обработка и проверка различных входных данных - PullRequest
0 голосов
/ 03 апреля 2020

это может быть немного длинно, поэтому извините заранее.

Я студент C, и мне поручено составить программу, которая вычисляет основную c арифметику c комплексных чисел. Я должен представить список команд (простой printf) и получить ввод от пользователя с именем и значениями команды.

комплексное число является структурой, и есть только 6, названных от A до F:

typedef struct complex{
    float real;
    float img;
    }complex, *complexPTR

например: чтобы умножить комплексное число на действительное число, пользователь введет mult_comp_real A,2.5.

, команда ввода mult_comp_real должна иметь пробел между ней и первым значением A.

между каждым значением должна быть запятая, и любое количество пробельных символов допускается, поэтому что-то вроде mult_comp_real A , 2.5 в порядке.

Моя главная проблема в том, что мне нужно выводить ошибку для каждой возможной ошибки ввода, например, если пользовательская команда ввода недопустима (multComp_rel), пропущены параметры (mult_comp_real A) или дополнительный текст (исключая пробелы) в конце командной строки (mult_comp_real A,2.5abc) .

Что касается потока программы, я решил сначала прочитать ввод имени команды mult_comp_real. оттуда я могу сказать с помощью if-elses, какая команда была введена и какие ожидаемые значения (2 комплексных, 2 действительных числа, их комбинация и т. д. c.).

оттуда я хочу прочитайте значения в правильный тип данных и напечатайте ошибку, если было введено слишком мало аргументов или если значения имеют недопустимый тип.

наконец, я хочу проверить оставшуюся часть ввода для любого лишнего текста мусора это не пробел, и выведите ошибку, если такой текст существует.

большинство моих попыток основывались на scanf для чтения команды и значений и fget c для проверки на наличие дополнительного текста, но я Я видел достаточно постов, в которых говорится, если это возможно - избегать использования scanf, и теперь я понимаю, почему хех. разрешение или руководство: \

Вот фрагмент кода из основного, который читает имя команды и вводит правильный блок if:

void main(void){
 complexPTR cmpxPTR;
 cmpxPTR = (complexPTR) malloc(sizeof(complex)*6);      /*allocates memory for 6 complex variables*/
 int i;
 for(i=0;i<6;i++){    /*initialize complex' values to 0*/
    cmpxPTR[i].real=0;
    cmpxPTR[i].img=0;
    }  
char c, choice[50]; 

do{
if(scanf(" %s", choice)==EOF){      /*reads the command name*/
    printf("Error: Reached end of file. Program terminated.\n");            
    break;
    }

if(strcmp(choice,"list")==0)                /*prints the list.*/
            printList();

else if(strcmp(choice,"read_comp")==0){         /*read_comp assign new values to complex number.*/
            char cmplx;        
            float re, img;  

            if(scanf(" %c", &cmplx)!=1 || !isalpha(cmplx) || !isupper(cmplx))   /*invalid complex input*/       
                    printf("ERROR: complex type \"%c\" is not a capital letter.\n", cmplx);

            if(scanf(" , %f , %f",&re, &img)!=2)    /*read real, img values to assign to complex variable cmplx*/
            printf("ERROR: \"%f\" or \"%f\" are invalid numbers\n", re, img);

        /*if((reminder=getchar()) != '\0' || reminder != EOF || reminder != '\n')
                printf("ERROR: Extraneous text after end of command.");    */               
            else{
            printf("Command entered is: \"%s %c %.3g %.3g\".\n",choice, cmplx, re, img);

            switch(cmplx){   /*send correct complex struct to read_comp for re-assignment*/
            case 'A':
                read_comp(cmpxPTR+(cmplx-'A'), re, img);
                break;                      /*, 1*/
            case 'B':
                read_comp(cmpxPTR+(cmplx-'A'), re, img);
                break;
            case 'C':
                read_comp(cmpxPTR+(cmplx-'A'), re, img);
                break;        
            case 'D':
                read_comp(cmpxPTR+(cmplx-'A'), re, img);
                break;
            case 'E':
                read_comp(cmpxPTR+(cmplx-'A'), re, img); 
                break;       
            case 'F':
                read_comp(cmpxPTR+(cmplx-'A'), re, img); 
                break;       

            default:                
                printf("ERROR: Undefined complex variable\n");  /*such as G, a, 5 etc*/
                break;
                    }
            }
    }   
else if(strcmp(choice,"stop") != 0)  
             printf("ERROR: Undefined command.\n");

if(strcmp(choice,"stop") != 0)  
        printf("\nPlease enter another command:\n");    

 } while (strcmp(choice, "stop") && (c=getchar()!=EOF));    /*exit while loop only when choice="stop"*/       

и read_comp просто:

void read_comp(complex* X, float real, float img){
    X->real = real;
    X->img = img;
    return;
}
...