C语言处理命令行输入

在C语言中,我们经常碰到想要处理命令行的情况。当往往由于C语言字符串比较难处理,最终出现各种奇怪的错误。现已算法指令为例,说明C语言命令行处理的框架。算法指令如下图所示:

算法 指令
加法 ADD op1 op2
减法 SUB op1 op2
乘法 MUL op1 op2
除法 DIV op1 op2

预期效果: 程序等待用户输入用户指令,当程序键入算法指令后,输出正确的结果;如果出现非法操作,则输出响应的出错信息。
在main函数中,处理程序的代码框架,do_line处理由命令行获取的一行数据数据:

1 while (fgets(buf, MAXLINE, stdin) != NULL)
2 {
3     if(do_line(buf))
4         break;
5 }

当do_line返回非0值时, 代表程序退出;但返回1时, 程序继续运行。注意fgets函数获取当前行的数据会包含’\n’,因此buf字符串末尾包含’\n’,’\0’两个字符。对每一行的处理在do_line_core函数中定义:

1 flag = get_token(cmd, line, &pos);
2 if (flag) {return 0;}                 //非法命令,重新输入
3 if (strcmp(“q”, cmd) == 0) return 1;  //退出程序
4
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;                        //未知命令,重新输入

get_token获取下一个命令或操作数,其中pos代表读取的当前地址。当获取的命令为非法命令(为空)时,返回1;否则返回0。

 1 int get_token(char *token, char *line, int *pos)
 2 {
 3     /* 保存当前的token指针 */
 4     char *token_saved = token;
 5     /* 去除开头的空格符号 */
 6     while (isspace(line[*pos]) && line[*pos]) (*pos)++;
 7     /* 获取pos位置开始的下一条命令或操作符 */
 8     while (!isspace(line[*pos]) && line[*pos])
 9     {
10         *token = line[*pos];
11         token++;
12         (*pos)++;
13     }
14     *token = ‘\0’;
15     /* 字符串为空,返回1 */
16     if (strcmp(token_saved, “”) == 0) return 1;
17     return 0;
18 }


简化
* 如果使用全局变量来描述每一行的数据,可以减少函数的参数。
* 如果在*nix环境下,可以使用setjmp, longjmp来简化处理逻辑1


  1. 《UNIX环境高级编程》第7章, “setjmp函数和longjmp函数“。 ?
时间: 2024-10-18 03:51:54

C语言处理命令行输入的相关文章

C语言--在命令行输入文件名字并打印文件内容

C语言编程中,经常遇到main函数中argc和argv[]这两个参数.argc是argument count的缩写,即参数的个数:argv是argument vector的缩写,即参数列表.argv[0]是程序本身的名字,argv[1]是在命令行中输入的第一个程序的参数,argv[argc]是NULL,如下所示: #include "stdio.h" int main (int argc, char *argv[]) { printf ("the argc value is

Java命令行输入求和的简单学习

思想:命令行输入的参数,必须先转换为数字才能进行加法计算,这就需要引用java.util.Scanner; 流程框图: 源代码: //实现几个整数相加的程序 //高开拓,2015.9.26 package add; import java.util.Scanner; public class Add { public static void main(String[] args){ Scanner scan = new Scanner(System.in); int n; System.out.

Linux 命令行输入

这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Linux界面,再按一次则退出全屏. 如何在Linux里输入命令行,这个问题让我捉急了好一会儿,之后发现,选中任何一个文件夹或者什么,右键,选择在终端中打开,就进入命令行输入界面了. 可以输入su root进入root权限,输入密码时不显示的,输完回车就好 然后就能使用root权限了.在哪个文件需要使用

异常处理:从命令行输入5个整数,放入一整型数组,然后打印输出。。。

从命令行输入5个整数,放入一整型数组,然后打印输出.要求: 如果输入数据不为整数,要捕获输入不匹配异常,显示"请输入整数":如果输入数据多余5个,捕获数组越界异常,显示"请输入5个整数". 无论是否发生异常,都输出"感谢使用本程序!" import java.util.InputMismatchException;import java.util.Scanner; public class ExceptionTest2 { public stat

c语言中命令行参数argc,argv[ ]

main(int argc,char *argv[ ]) argv为指针的指针 argc为整数 char **argv or: char *argv[] or: char argv[][] main()括号内是固定的写法. 下面给出一个例子来理解这两个参数的用法: 假设程序的名称为prog, 当只输入prog,则由操作系统传来的参数为: argc=1,表示只有一程序名称. argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog 当输入prog para_1,有一个参数,则由操

R语言使用命令行参数

args_test.R 代码如下: Args <- commandArgs()cat("Args[1]=",Args[1],"\n")cat("Args[2]=",Args[1],"\n")cat("Args[3]=",Args[3],"\n")cat("Args[4]=",Args[4],"\n")cat("Args[5]=&qu

go语言 从命令行获取参数解析

go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的示例代码一样使用os.Args来获取命令行参数 package main import "fmt" import "os" func main(){ if len(os.Args)>0 { for index , value := range os.Args { fmt.Println(index, value

eclipse---之Console窗口命令行输入

在 Eclipse 中使用 Windows 命令行. 第一步:设置一个新的外部配置工具  在 Eclipse 中,选择 “Run -> External Tools -> External Tools Configurations”  第二步:点击 “New Launch Configuration”  第三步:New Configuration 界面  第四步:提供命令行配置的详细信息  Name:就是你配置的名字,随便取  Location:CMD.exe 的文件位置  Working D

[C语言]在命令行编译执行程序

----------------------------------------------------------------------------------------- 1. 在Mac和Linux上写C语言之前,首先要看看是否安装了编译器: 在终端下输入gcc后回车进行检测,如果安装过,将提示 clang: error: no input files(没有输入文件): 如果没有安装,在Mac下根据提示安装Xcode或gcc编译器即可,在CentOS下直接yum -y install g