c语言cp
㈠ 基于c语言的简单cp命令实现
main函数的参数,就是命令执行时,传给程序的参数,一般两个,一个是整数,表示传入参数的个数,一个是字符串数组,传入的参数,都是字符串,命令行输入时用空格分隔。
可以用system(ls)命令,生成目录名称,突出到文件,通过字符处理,查看文件属性,对于目录,执行下一级cp,对于一般文件,按二进制文件读写复制。
㈡ 有用c语言程序实现系统的cp命令的代码么,求帮助
linux系统下的CP命令的源代码是包含在coreutils里的。
或者使用rpm的源码包,我们可以输入命令:whereis cp
找到cp所在的路径
rpm -qf /bin/cp
使用rpm的qf参数能够查到某个文件属于哪个rpm包
我的机子的结果:coreutils-5.2.1-31.6
然后再到rpmfind.net中找coreutils的src.rpm源码.
rpm -ql -p /path/to/coreutils-5.2.1-31.src.rpm
rpm -ivh coreutils-5.2.1-31.src.rpm
然后在/usr/src/RedHat/SOURCES/(这个目录的名称不一定,取决于你装的是什么系统)就可以找到相应的源代码了。
举一反三,可以找到其他命令的源代码。
另外,Ubuntu中可以用apt-get -d source "coreutils" 这条命令来下载源代码,很方便。
㈢ C语言中的指针表达式,请大家根据图详细讲下,谢谢
先教你一个区分左值和右值的方法:
你可以试着对表达式进行取址操作,如果表达式不能进行取址的话,那么就可以看做右值。如果可以取址,就有可能是左值也有可能是右值。
举个例子
int
a
=
0;
这里对a进行取址操作,&a,是合法的,所以a可以是左值也可以是右值;
再来,&0,这样肯定不行的,所以0是个右值。同样的像"a"、a+b这类的都属于右值。
然后说你发的图:
第一个图:cp是个指向char的指针。
char
c
=
'a';
char
*cp
=
&c;
图一简单描述如上,首先他是一个指针,他指向的内存里放的是char型的‘a’。
那么按照我给你的技巧试一下,对cp进行取址操作,即&cp,这是合法的,也就是说cp可能是左值也可能是右值。
cp是左值的例子:char
temp
=
'd';
cp
=
&temp;
//这里cp是左值(图一的右边)
cp是右值的例子:char
*cp2
=
cp;
//这里cp是右值(图一左边)
第二张图:&cp,还是按照我给你的方法,&(&cp)这是不合法的,所以&cp只能当做右值。
&cp做右值的例子:char
**cpp
=
&cp;
//这里实际上是用一个临时的地址存放了&cp的值并附给cpp。
从上面的例子可以看出&cp实际上是临时的一个值,你并不知道他的内存地址,所以不能给他赋值,也就是不能把&cp当左值。
第三张图还是用那方法。&(*cp)是合法的所以可以是左值也可以是右值。
左值例子:*cp
=
's';
//图三右边;
右值例子:char
s
=
*cp;
//图三左边;
第四张图:&(*cp+1)是不合法的。所以*cp+1只能是右值;
右值例子:int
n
=
(int)(*cp+1);
//这里跟第二张图情况一样,实际上*cp+1的结果是个临时的值,所以不能对这个临时的值进行赋值,也就是说他不可以当左值。
㈣ Linux中我用C语言创造一个CP文件,要./cp才可以运行,怎么才可以直接cp就运行C语言文件而不是cp命令
修改环境变量PATH,加上当前目录“.”
export PATH=$PATH:.
或者使用别名:alias cp=/dir/cp
㈤ c语言修仙祁云和常寂是cp吗
c语言修仙祁云和常寂不是cp。
《C语言修仙》是一部由一十四洲写的已完结耽美小说。
作品文案
林浔是一个程序员,通宵编代码后发现自己身体内多了一个程序输入窗口。他尝试编了一个循环程序。第二天,邻居家老头找上门来:小浔,你小小年纪,竟已跨入炼气期,做我门下弟子如何?
第三天,在街上被人拍肩膀:少年,你骨骼惊奇,加入我宗门如何?林浔:???后来,他发现现代社会真的有修仙者。而别人修仙靠灵力,自己修仙靠编程,还能看见别的修仙者体内的程序。
某元婴大佬:竖子!你怎能窥破我剑招的破绽?
林浔淡定收剑:你程序有bug。
某渡劫大神:我不甘心!你这招叫什么?
林浔扶眼镜:蒙特卡洛算法。
然后,他就这样渐渐成了修真界的传说。
㈥ C语言,怎么想到数量关系式的
这里不过是循环嵌套。
14行:既然表达式中用到B[m][n]。而B数组定义时int B[3][3],n在循环中最大不超过2。所以循环中n初值0,循环条件就是n<3。否则数据访问越界。
16行:循环累加,n+i对应的是A[m][n+i](int A[3][16]}),同理要确保数组不能访问越界,n+i最大不超过15,而循环中n取值0~2,i取值0~13,n+i刚好在区间内。
至于为什么这么写,全看运算需求,单独看代码没有意义。同一种运算要求还有多种方法。
PS:这个代码中int C[1][14],只有1行,没必要定义成二维数组,直接定义一维数组int C[14]即可。另外注意C[0][i]/16,除号两边是整数,是整除。小数不保留。
可以不用i,来实现滑动,比如使用指针数组来执行A对应B的区间:
下面代码fun1是你书本代码,fun2是我另写得指针方法,对比可以实现同样效果。(演示数值我就不按照书本上输入了,你想一样自己改A的值)。
#include <stdio.h>
int A[3][16]={{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},
{17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32},
{33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48}};
int B[3][3]={{1,2,1},{2,4,2},{1,2,1}};
int c[1][14]={};
void fun1();
void fun2();
int main()
{
printf("用书本方法: ");
fun1();
printf(" ");
printf("用指针方法: ");
fun2();
return 0;
}
void fun2()
{
int m,n,*p[3][3]={},*cp=NULL;//A对应B的矩阵区间,用指针数组表示
p[0][0]=&A[0][0];
cp=&c[0][0];
while(1)
{
for(m=1;m<3;m++) p[m][0]=p[0][0]+16*m;
for(m=0;m<3;m++)
for(n=1;n<3;n++)
p[m][n]=p[m][0]+n;
for(m=0,*cp=0;m<3;m++)
for(n=0;n<3;n++)
*cp+=*(p[m][n])*B[m][n];
*cp=*cp/16;
printf("%5d",*cp);
if(p[0][0]==&A[0][13])
break;
(p[0][0])++;
cp++;
}
}
void fun1()
{
int i,m,n;
for(i=0;i<14;i++)
{
for(m=0;m<3;m++)
{
for(n=0;n<3;n++)
c[0][i]+=A[m][n+i]*B[m][n];
}
c[0][i]=c[0][i]/16;
printf("%5d",c[0][i]);
}
}
㈦ c语言中cp是什么意思
cp在c语言中没有特别的含义
在linux系统中,它是一个命令行程序,作用是文件
㈧ C语言实现CP指令
用C实现的步骤是:
1、解析命令,就是提取出源路径和目标路径,以及文件名。
2、写一个切换目录的函数,比如chgdir(char *),路径名字做参数。
3、执行切换目录函数,正确执行后,在这个目录下找到目标文件,定义一个缓冲区,把文件内容拷贝进去,找不到文件另作处理。
4、再调用2步骤中的目录切换函数,在目标路径下建立一个空文件并把缓冲区内容写进去,保存。
㈨ linux中cp命令如何用 C语言实现
1,首先需要了解cp的原理。
2,可以参考cp的源码去了解其原理
3,cp命令的源码可以在linux内核中找到。
4,或者下载busybox其中也会有cp的源码
只有了解其原理之后才能谈如何实现。参考代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#defineBUF_SIZE1024
#definePATH_LEN128
voidmy_err(char*err_string,intline)
{
fprintf(stderr,"line:%d",line);
perror(err_string);
exit(1);
}
void_data(constintfrd,constintfwd)
{
intread_len=0,write_len=0;
unsignedcharbuf[BUF_SIZE],*p_buf;
while((read_len=read(frd,buf,BUF_SIZE))){
if(-1==read_len){
my_err("Readerror",__LINE__);
}
elseif(read_len>0){//把读取部分写入目标文件
p_buf=buf;
while((write_len=write(fwd,p_buf,read_len))){
if(write_len==read_len){
break;
}
elseif(write_len>0){//只写入部分
p_buf+=write_len;
read_len-=write_len;
}
elseif(-1==write_len){
my_err("Writeerror",__LINE__);
}
}
if(-1==write_len)break;
}
}
}
intmain(intargc,char**argv)
{
intfrd,fwd;//读写文件描述符
intlen=0;
char*pSrc,*pDes;//分别指向源文件路径和目标文件路径
structstatsrc_st,des_st;
if(argc<3){
printf("用法./MyCp<源文件路径><目标文件路径> ");
my_err("argumentserror",__LINE__);
}
frd=open(argv[1],O_RDONLY);
if(frd==-1){
my_err("Cannotopnefile",__LINE__);
}
if(fstat(frd,&src_st)==-1){
my_err("staterror",__LINE__);
}
/*检查源文件路径是否是目录*/
if(S_ISDIR(src_st.st_mode)){
my_err("略过目录",__LINE__);
}
pDes=argv[2];
stat(argv[2],&des_st);
if(S_ISDIR(des_st.st_mode)){//目标路径是目录,则使用源文件的文件名
len=strlen(argv[1]);
pSrc=argv[1]+(len-1);//指向最后一个字符
/*先找出源文件的文件名*/
while(pSrc>=argv[1]&&*pSrc!='/'){
pSrc--;
}
pSrc++;//指向源文件名
len=strlen(argv[2]);
//.表示复制到当前工作目录
if(1==len&&'.'==*(argv[2])){
len=0;//没有申请空间,后面就不用释放
pDes=pSrc;
}
else{//复制到某目录下,使用源文件名
pDes=(char*)malloc(sizeof(char)*PATH_LEN);
if(NULL==pDes){
my_err("mallocerror",__LINE__);
}
strcpy(pDes,argv[2]);
if(*(pDes+(len-1))!='/'){//目录缺少最后的'/',则补上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*打开目标文件,使权限与源文件相同*/
fwd=open(pDes,O_WRONLY|O_CREAT|O_TRUNC,src_st.st_mode);
if(fwd==-1){
my_err("Cannotcreatfile",__LINE__);
}
_data(frd,fwd);
//puts("endof");
if(len>0&&pDes!=NULL)
free(pDes);
close(frd);
close(fwd);
return0;
}