#Cprove38 带参数的main函数

NO.1用命令行运行程序

用命令行的方式运行程序

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
    FILE *p1,*p2;
    int c;
    p1=fopen(argv[1], "r");
    p2=fopen(argv[2], "w");
    while((c=fgetc(p1))!=EOF)
        fputc(c,p2);
    fclose(p1);
    fclose(p2);
    printf("argc=%d\n",argc);	//查看参数个数
    printf("argv[0]= %s\n",argv[0]);	//查看各个参数的值
    printf("argv[1]= %s\n",argv[1]);
    printf("argv[2]= %s\n",argv[2]);
    printf("argv[3]= %s\n",argv[3]);
    printf("复制完毕!敲任一键退出...\n");
    getchar();   //这一句在命令行下运行时很关键,可以在程序结束前停下来(等待输入)
    return 0;
}

在工程目录下的bin\Debug中找到编译后的.exe文件(本程序是tc.exe),shift+右键,“在此处运行命令窗口”打开Dos窗口,输入命令(exe程序名)和各参数
在这里插入图片描述

NO.2 带行号显示文件

(1)设计一个程序,读取命令行中给出的文件,将其内容在屏幕上显示出来,并在其行首显示行号(行号从1开始);
(2)改造上面的程序,若命令行中给出多个文件名,逐个加行号显示文件内容

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
    FILE *fp;
    int L_num=0;
    char line[256];
    int i=1;
    while(i<argc)   //读取的文件数目比参数数目少1,程序名占了一个参数
    {
        fp=fopen(argv[i], "r");
        printf("%s 内容:\n",argv[i]);
        while(!feof(fp))
        {
            fgets(line,256,fp);
            L_num++;
            printf("%d\t",L_num);
            puts(line);
        }
        printf("\n");
        fclose(fp);
        L_num=0;
        i++;
    }
    printf("\n\nargc=%d\n",argc);
    for(i=0;i<argc;i++)
        printf("argv[%d]= %s\n",i,argv[i]);
    printf("读取完毕!敲任一键退出...\n");
    getchar();   //这一句在命令行下运行时很关键,可以在程序结束前停下来(等待输入)
    return 0;
}

在这里插入图片描述

小结

也可以用指针数组
在这里插入图片描述
但这样每次只能读取固定数目的文件,在DOS窗口运行时修改不方便,还是用第一种不限定文件数量的好;哎等等,好像P[N+1]改成p[argc]这样能行!虽然不提倡但编译没毛病哈哈
在这里插入图片描述

NO.3 命令行加法器

建立项目add,设计一个用命令行能运行的加法器,其中加数的个数不定:
输入:add 1 3
输出 4
输入:add 1 3.1 2 6
输出 12.1
输入:add 1 3 a 6
输出:命令行中出现非法运算量!
本程序参考命令行加法器

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
double str2double(char *str);
int main(int argc,char *argv[])
{
    int i;
    double sum=0;
    //判断参数是否够用
    if(argc<3)
        printf("参数不够,无法运算!\n");
    //进行加法运算
    else
    {
        for(i=1;i<argc;i++)
            sum+=str2double(argv[i]);
    }

    //显示结果
    for(i=1;i<argc;i++)
        printf("%s + ",argv[i]);
    printf("\b\b ");            //光标前移两个位置并用空格代替
    printf("\n和为:%f\n",sum);
    return 0;
}
/**
 将字符串转换为数字。
 标准库中有类似的转换函数strtod或strtof
 可参考链接 https://www.cnblogs.com/sddai/p/5774121.html
 */

double str2double(char *str)
{
    int sign=1;
    double n=0;
    double k;
    if(*str=='-')   //如果是负数,结果乘-1
    {
        sign=-1;
        str++;
    }
    while(isdigit(*str))    //是数字则转成十进制
    {
        n=n*10+*str-'0';
        str++;
    }
    if(*str=='.')   //小数后面的部分转十进制
    {
        str++;
        k=0.1;
        while(isdigit(*str))
        {
            n+=(*str-'0')*k;
            k/=10;
            str++;
        }
    }
    if(*str!='\0')
    {
        printf("有非法运算量!\n");
        exit(1);
    }
    return sign*n;
}

在这里插入图片描述

小结

程序中写了个str2double函数,可以使用C标准库函数简化程序,还可以举一反三写个double2str函数。
数字与字符串相互转化可参考:C语言字符串与数字相互转换
1.使用库函数将数字转换为字符串:

/**
 使用C标准库函数,将double数据转换成string字符串
  ● 头文件 stdlib.h

  ● itoa():将整型值转换为字符串。

  ● ltoa():将长整型值转换为字符串。

  ● ultoa():将无符号长整型值转换为字符串。

  ● gcvt():将浮点型数转换为字符串,取四舍五入。

  ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。

  ● fcvt():指定位数为转换精度,其余同ecvt()。
 */

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    int num_int=123;
    double num_double=3.1415;
    char str_int[20];
    char str_double[20];

    itoa(num_int,str_int,10);   //按十进制将int型转为字符串
    gcvt(num_double,8,str_double);  //按8位有效数字将double型转字符串

    printf("int_str: %s\n",str_int);
    printf("double_str(8位): %s\n",str_double);
    gcvt(num_double,4,str_double);  //按8位有效数字将double型转字符串(四舍五入)
    printf("double_str(4位): %s\n",str_double);

    //下面看ecvt函数用法
    int dec=0,sign=0;
    double a=1.7325;
    char *str1,*str2;
    printf("\n实验double数据a=%.4f\n",a);
    str1=ecvt(a,8,&dec,&sign);  //a转为8位有效数字字符串,小数点位置给dec,符号值给sign
    printf("ecvt(8位有效数字): %s\tdec:%d\tsign:%d\n",str1,dec,sign);
    str2=ecvt(a,4,&dec,&sign);
    printf("ecvt(4位有效数字): %s\t\tdec:%d\tsign:%d\n",str2,dec,sign);

    //再看fcvt函数用法
    printf("\n");
    str1=fcvt(a,8,&dec,&sign);  //a转为小数点后有8位的字符串
    printf("fcvt(8位小数): %s\tdec:%d\tsign:%d\n",str1,dec,sign);
    str2=fcvt(a,3,&dec,&sign);
    printf("fcvt(4位小数): %s\t\tdec:%d\tsign:%d\n",str2,dec,sign);
    return 0;
}

在这里插入图片描述
2. double2str函数:

/**
 不使用C标准库函数,将double数据转换成string字符串
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 5     //最大小数位数
void double2str(double n,char *str);
int main()
{
    double a=123.1415;
    char str[10]={'\0'};
    double2str(a,str);
    printf("%.4f 字符串:%s\n",a,str);
    return 0;
}
void double2str(double n,char *str)
{
    int b,i,len,j,dec;
    double c;
    char s1[10]={'\0'}; //存整数
    b=fabs(n);
    c=fabs(n)-b;
    i=0;
    while(b!=0)
    {
        s1[i]=b%10;
        b/=10;
        i++;
    }
    len=(n<0?(++i):i);  //如果是负数则加一个元素
    while(1)
    {
        i--;
        if(s1[len-1-i]==0)
            break;
        str[i]=s1[len-i-1]+'0';

    }
    if(i==0)
        str[0]='-';

    j=len-i-1;
    str[j]='.';
    dec=0;      //小数位数
    while(1)
    {
        j++;
        dec++;
        if(dec>=N)
            break;
        c=c*10;
        b=(int)c%10;
        str[j]=b+'0';
    }
}

在这里插入图片描述
最后一位由于不是精确数,所以有误差。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值