学习笔记 main函数带命令行参数的使用(头歌)

该博客介绍了如何编写一个C程序,该程序接收命令行参数,解析包含运算符的字符串,并进行相应的数学运算。用户通过命令行输入如'mycal 100+200'或'mycal 100*200',程序会输出计算结果。内容涵盖了main函数参数的使用,字符串解析以及基本运算的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

请编写一个程序:把程序build后生成的可执行文件(假设文件名为mycal.exe)放到C盘根目录下,在命令行提示符下,转到c:\下 ,键入mycal 100+200 运行的结果为 300.00;键入mycal 100*200 运行的结果为20000.00 等。 程序中的运算符与C语言中的运算符在字符上保持一致。计算结果保留小数点后两位有效数字。

相关知识

为了完成本关任务,你需要掌握:

(1)main函数中参数的有关知识

(2)字符串及字符指针数组

main函数中参数的有关知识

(1)main函数是程序执行的入口。

(2)main函数可以有返回值,也可以无返回值。

(3)main函数可以带参数,也可以不带参数。

例: void main(); int main(); int main(int argc,char* argv[]);

以下代码是main函数带参数情形下的一个典型的例子,弄懂了它,本关你就容易通过了一半:

//argc:表示字符指针数组argv的元素的个数,其最小值为1
//argv:字符串数组,该数组的每一个元素都是一个字符串,
//argv[0]:表示该程序所在的完整路径,这个参数的值由操作系统传入,用户通常不能更改
//argv[1],argv[2]...为用户通过命令行运行该程序时输入的用户参数,都是字符串。
#include<stdio.h>
int main(int argc, char* argv[])
{
	int k;
	printf("参数个数:%d\n", argc);
	for (k = 0; k < argc; k++)
	{
		printf("参数%d:", k);
		puts(argv[k]);
	}
	getchar();
	return 0;
}

大家可以复制以上这段代码到你的本地开发环境,build后,双击生成的可执行文件(假设为project1.exe),将会显示类似如下的运行结果界面。

直接双击运行可执行文件,相当于用户没有给main传入任何参数,因此参数个数就是默认的1,argv[0]存储就是第1个参数的值,就是当前应用程序的完整路径(含文件名) 若用户想传入参数,就必须在命令行下运行该程序,其操作如下: 第1步:系统“开始”菜单,在搜索文本框中输入“cmd”,如图:

第2步:假设你的程序在D盘(d:\myapp\project1.exe),输入D:,回车,然后输入: cd d:\myapp,将会把project1.exe文件所在目录设为当前目录

此时,你可以在命令行下运行该程序了。如下图所示。

按照上面照本宣科的练习测试,你应该能够搞懂带参数的main的用法了。 也就是说,用户通过命令行传入给main的第1个参数为argv[1],它是一个字符数组(或字符串),针对本题,你的程序代码无非就是对该字符串进行解析,得到其中的运算符和左右两边的操作数,从而做相应的运算,输出结果即可。

编程要求

本程序的源文件包含两个,1个是main函数所在的源文件main.c,另一个是对一个字符串进行解析的函数的定义源文件myfun.c,你只需要在理解main.c中代码的基础上,在右侧代码区给定的地方完成myfun.c中的代码即可(你也可以删除已有代码,按照你的思路从零开始)。main.c的代码如下:

#include<stdio.h>
void processUserInputStr(char* s);
int main(int argc, char* argv[])
{
	processUserInputStr(argv[1]);

	return 0;
}

代码实现

#include<string.h>
#include <stdlib.h>
//s:一个形如a[运算符]b的字符串,例如:4.5+9,6-9,4/5,8*7...
//该函数经过处理,输出数的运算结果,例如若s为"20.3+1",则该函数在屏幕上输出21.30(保留小数点后面2位有效数字
//此函数内部操作的基本算法为:
//第1步:找到运算符对应的位置索引
//第2步:根据运算符位置,将其前面的字符串复制到strA,后面的字符串复制到strB
//第3步:将strA,strB转换为数值(使用函数atof,具体用法请百度)a,b
//第4步:根据运算符,对a,b进行相应的运算
//第5步:输出运算结果result
void  processUserInputStr(char* s)
{

	int len=strlen(s); //s中有效字符的个数
    //rA,strB分别用于存放两个操作数对应的字符串
    char strA[100],strB[100];
    //a,b分别用于存放将字符串转换后的数,result用于保存运算结果
    double a,b,result;
    char op;//用于存储s中的运算符对应的字符串
    int k,posOp;//posOp:符号的位置索引
    /**********begin**********/
    for(k=0;s[k]!='+' && s[k]!='-' && s[k]!='*' && s[k]!='/';k++)
    {
    	strA[k]=s[k];
	}
	op=s[k];int j,i;


	for(i=0,j=k+1;s[j]!='\0';i++,j++)
	{
		strB[i]=s[j];
	}

	a=atof(strA);
	b=atof(strB);
	switch(op){
	case '+':result=a+b;break;
	case '-':result=a-b;break;
	case '*':result=a*b;break;
	case '/':result=a/b;break;
	default:printf("input wrong");
	}
    printf("%.2lf",result);
   
    /**********end**********/
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值