int main(int argc,char **argv)中的两个参数是什么?
主函数中的参数:
int main(int argc,char **argv){}
main中的argc是指我们在终端中使用的字段的个数。
main中的argv是一个二级指针,指向的是字符数组的指针。
例如我们在linux中使用 cp demo1.c demo2.c的时候
有cp,demo1.c,demo2.c 三个字段,所以argc的值为3
而argv指向的是一个字符数组。那么cp就是argv[0]中的内容。demo1.c就是argv[1]的内容,demo2.c就是argv[2]的内容
举个例子:
#include<stdio.h>
int main(int argc,char **argv)
{
printf("一共有%d个字段\n",argc);
printf("第一个字段是%s\n",argv[0]);
printf("第二个字段是%s\n",argv[1]);
printf("第三个字段是%s\n",argv[2]);
return 0;
}
输出结果为:
通过这个知识,我们可以做一个类似于cp功能的文件。例子如下:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int main(int argc,char **argv)
{
int fd1;//初始文件的文件描述符
int fd2;//复制后的目标文件的文件描述符
int size;//初始文件的内容大小
char *readBuf=NULL;
fd1=open(argv[1],O_RDWR);
size=lseek(fd1,0,SEEK_END);//返回fd1的大小给size
lseek(fd1,0,SEEK_SET);//光标已经到最后了,所以得把它还原回去
readBuf=(char *)malloc(sizeof(char)*size+8);//加8是为了防止一些意外,怕因为一些别的原因导致内存不够
read(fd1,readBuf,size);
fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
write(fd2,readBuf,size);
close(fd1);
close(fd2);
return 0;
}
第二个应用,如果文件中有字符想要修改,应该如何操作
例如:文本中为:李华学号是2,我想改成李华学号是3。该如何操作
首先这里得先补充一个函数的了解
strstr()函数的介绍
strstr()函数的参数:
*haystack:需要修改的字符串的地址
*needle:字符串中的子字符串(可以理解为字符串中的某一个词的字段)
strstr会返回一个指针,指向你输入的子字符串的首位置
了解完以后就可以开始写代码了。代码如下:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char **argv)
{
int fd;
int size;
char *readBuf;
char *p;
if(argc!=4){printf("操作失败\n");exit(-1);}
fd=open(argv[1],O_RDWR);
size=lseek(fd,0,SEEK_END);//把原文件中内容的大小赋值给size
lseek(fd,0,SEEK_SET);
readBuf=(char *)malloc(sizeof(char)*size+8);
read(fd,readBuf,size);
lseek(fd,0,SEEK_SET);//因为读取完以后,光标又到尾巴了,所以必须归位
p=strstr(readBuf,argv[2]);//去找我们想要找的子字符串的位置
p=p+strlen(argv[2]);//使指针指向我们想要修改的位置
*p=*argv[3];//将用户想要输入的东西赋值给当前位置
write(fd,readBuf,size);
close(fd);
return 0;
}