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;
}