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';
}
}
最后一位由于不是精确数,所以有误差。