十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
樓主的意思明顯是不能用字符串函數(shù),要用自己的自定義函數(shù)連接
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),白云鄂企業(yè)網(wǎng)站建設(shè),白云鄂品牌網(wǎng)站建設(shè),網(wǎng)站定制,白云鄂網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,白云鄂網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
main()
{
char s1[100]={'a','b','c','d','e','f','g','\0'};
char s2[100]={'h','i','j','k','\0'};
printf("s1=%s\n",s1);
printf("s2=%s\n",s2);
lj(s1,s2);
getch();
}
lj(char s1[],char s2[])
{
char s3[100];
int i=0,j=0;
while(s1[i]!='\0')
{
s3[i]=s1[i];
i++;
}
while(s2[j]!='\0')
{
s3[i]=s2[j];
i++;j++;
}
i++;
s3[i]='\0';
printf("s3=%s\n",s3);
}
2, 6, 42, 3
開始看到這個程序,我覺得明顯有問題,可是運(yùn)行了下,卻極其正常。找了下資料發(fā)現(xiàn),得主要是static和局部、全局量的作用域的問題。
注意這兩點(diǎn),然后再去分析程序:
1.靜態(tài)局部變量在程序編譯時被首次初始化,即以后的函數(shù)調(diào)用不再進(jìn)行初始化,而是使用上次調(diào)用結(jié)束時的值。靜態(tài)量數(shù)據(jù)有單獨(dú)的存儲區(qū)。
2.全局變量在整個函數(shù)有效,但是當(dāng)某個局部變量與全局變量同名時,在該局部變量所在域內(nèi),只有該局部變量有效,與其同名的全局變量無效。
在所述程序中,全局變量i在for的{}內(nèi)是無效的,起作用是靜態(tài)局部變量i。而靜態(tài)變量編譯時初始值為1。另,for的循環(huán)控制部分在{}外,起作用的全局量i。
在下面的分析中1.指第一次循環(huán),依此類推。
int Square(int i)
{
return i*i; //返回i^2給調(diào)用者;
}
main()
{
int i=0; //i=0;
i = Square(i); //調(diào)用Square,i=i^2,即0=0^2=0;
for ( ; i3; i++) //1.第一輪循環(huán),i(全局)為0,滿足條件
{ //2.第二輪循環(huán)開始i=1
//3.第三輪開始,i為2
//4.i=3,不符,循環(huán)退出
static int i=1; //程序編譯時被賦值為1,以后不再賦值。
//1.此時用的是編譯時被賦的值,即1;
//2.i(局部)為上次調(diào)用結(jié)束時的結(jié)果2
//3.原理同上,此時為6
i += Square(i); //1.i=1+1*1=2
//2.i=2+2*2=6
//3.i=6+6*6=42
printf("%d, ", i); //1.輸出:2+,+空格
//2.輸出:6+,+空格
//3.輸出:42+,+空格
} //1.第一次循環(huán)結(jié)束,i(全局,原為0)+1,值為1
//2.第二輪循環(huán)結(jié)束,i(全局)+1,是2
//3.第三輪循環(huán)結(jié)束,i為3
printf("%d\n", i);//輸出外部變量i,其值為循環(huán) 退出時的值3.
}
其實(shí),把外部變量換個名字是一樣的效果。更容易明白。如下:
int main(int argc, char* argv[])
{
int j=0;
j = Square(j);
for ( ; j3; j++)
{
static int i=1;
i += Square(i);
printf("%d, ", i);
}
printf("%d\n", j);
return 0;
}
C main是入口
D printf 是標(biāo)準(zhǔn)庫函數(shù)的函數(shù)名
A ''單引號中的必須是字符型
A char a='A',b='B'
B 0為假,其他為真
sqrt函數(shù)返回值是double。表達(dá)式包含隱性轉(zhuǎn)換,規(guī)則就是盡量保證數(shù)據(jù)精度不丟失。
對編程人員來說,double 和 float 的區(qū)別是double精度高,有效數(shù)字16位,float精度7位。但double消耗內(nèi)存是float的兩倍,double的運(yùn)算速度比float慢得多,C語言中數(shù)學(xué)函數(shù)名稱double 和 float不同,不要寫錯,能用單精度時不要用雙精度(以省內(nèi)存,加快運(yùn)算速度)
輸出結(jié)
果:cdeab
分析:只要你理解了move函數(shù)的作用你就能明白整個過程:
第一次循環(huán)調(diào)用move(char
*str,int
n)這一函數(shù)給它的參數(shù)是
s與
s的長度(就是你輸入的abcde的長度5),第一步執(zhí)行temp=str[5-1]=str[4],而str[4]的值為'e',所以temp的值為'e',接著執(zhí)行for(i=n-1;
i0;i--)
str[i]=str[i-1];
這個循環(huán)是把從str[1]開始的所有數(shù)組的元素都后移一位,
即str[2]成了str[1],str[3]成了str[2]等等,循環(huán)執(zhí)行完后執(zhí)行str[0]=temp;,也就是把e賦值給了
str[0]。所以abcde被move函數(shù)處理一次后就成了
eabcd,如果再被處理一次后就被變成deabc等等
也就是說move函數(shù)每調(diào)用一次就把相應(yīng)的字符串循環(huán)右移一位