In the C language, we often encounter situations where we want to handle the command line. When the C language string is often difficult to deal with, eventually there are a variety of strange errors. An example of an algorithm instruction is presented, which illustrates the framework of the C language command-line processing. The algorithm directives are as follows:
algorithm |
instruction |
Addition |
ADD OP1 OP2 |
Subtraction |
SUB OP1 OP2 |
Multiplication |
MUL OP1 OP2 |
Division |
DIV OP1 OP2 |
expected effect : The program waits for the user to enter a user instruction, outputs the correct result when the program has typed the algorithm directive, and outputs an error message for the response if an illegal operation occurs.
In the main function, the code framework for the handler do_line processing a row of data data obtained by the command line:
1 while (Fgets (buf, MAXLINE, stdin)! = NULL) 2 {3 if (Do_line (BUF)) 4 Break ; 5 }
When Do_line returns a value other than 0, the program exits, but returns 1 o'clock, and the program continues to run. Note that the Fgets function gets the data for the current row will contain ' \ n ', so the BUF string ends with ' \ n ', ' two characters '. The processing of each row is defined in the Do_line_core function:
1Flag = Get_token (cmd, line, &POS);2 if(flag) {return 0;}//illegal command, re-entry3 if(strcmp ("Q", cmd) = =0)return 1;//Exit Program4 5 if(strcmp ("Add", cmd) = =0) ...6 Else if(strcmp ("Sub", cmd) = =0) ...7 Else if(strcmp ("Mul", cmd) = =0) ...8 Else if(strcmp ("div", cmd) = =0) ...9 Else return 0;//unknown command, re-enter
Get_token gets the next command or operand, where POS represents the current address of the read. When the command obtained is illegal (empty), 1 is returned, otherwise 0 is returned.
1 intGet_token (Char*token,Char*line,int*POS)2 {3 /*Save the current token pointer*/4 Char*token_saved =token;5 /*Remove the opening space symbol*/6 while(Isspace (Line[*pos]) && Line[*pos]) (*pos) + +;7 /*gets the next command or operator at the beginning of the POS position*/8 while(!isspace (Line[*pos]) && line[*POS])9 {Ten*token = line[*POS]; Onetoken++; A(*pos) + +; - } -*token = ' \0'; the /*string is empty, return 1*/ - if(strcmp (Token_saved, "") = =0)return 1; - return 0; -}
Simplified :
* If you use global variables to describe the data for each row, you can reduce the parameters of the function.
* If you are in a *nix environment, you can use setjmp, longjmp to simplify processing logic 1.
Advanced Programming for the UNIX environment, chapter 7th, "setjmp functions and LONGJMP functions".?
C Language Processing command line input