目錄
在成都網(wǎng)站設計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設置、關鍵詞群組等細微處著手,突出企業(yè)的產(chǎn)品/服務/品牌,幫助企業(yè)鎖定精準用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營銷成為有效果、有回報的無錫營銷推廣。創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設10余年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。一、字符串逆序(基礎題)
1.一個經(jīng)典的錯誤,標準的零分
2.采用gets函數(shù)來修補漏洞
?編輯
3.非要使用scanf怎么辦?
4.使用指針來實現(xiàn)逆序函數(shù)
5.將函數(shù)修改為,只要傳入兩個地址,就能逆序這兩個地址之間的字符串。
二、字符串逆序(進階)
鏈接:字符逆序__牛客網(wǎng)
來源:??途W(wǎng)
這道題的要求是讓我們實現(xiàn)一個字符串逆序
1.一個經(jīng)典的錯誤,標準的零分這道題其實,思路上不難,但是有一個點處很容易犯錯,我們看下面這個代碼
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
scanf("%s", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
看似正確,但實際上存在一個問題,我們現(xiàn)在??途W(wǎng)上跑一下
果然如我們所料,出現(xiàn)意外了,那么問題出在哪里了呢?其實,問題是出在scanf上了,scanf默認讀取到空格就結(jié)束了,因此這道題其實只讀取了一個d,反轉(zhuǎn)之后當然是d了
2.采用gets函數(shù)來修補漏洞既然scanf不能用,那么該如何解決呢?,其實我們c語言中還有一個函數(shù)叫做gets()函數(shù),他也可以讀取一個字符串,他不會讀取到空格就結(jié)束了
代碼如下
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
gets(arr);
reverse(arr);
printf("%s", arr);
return 0;
}
??途W(wǎng)運行結(jié)果為
3.非要使用scanf怎么辦?有些時候,非要使用scanf解決這個問題,那么我們?nèi)绾螌崿F(xiàn)呢?,其實我們可以將%s修改為%[^\n],意思是,讀取到\n才結(jié)束讀取
代碼如下
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
??途W(wǎng)運行結(jié)果為
4.使用指針來實現(xiàn)逆序函數(shù)上面的實現(xiàn)方式,其實本質(zhì)上仍然屬于數(shù)組的形式,那么我們能不能改為指針呢?答案是可以的,請看下面的代碼
#include#includevoid reverse(char* str)
{
char* left = str;
char* right = str + strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
??途W(wǎng)運行結(jié)果為
5.將函數(shù)修改為,只要傳入兩個地址,就能逆序這兩個地址之間的字符串。經(jīng)歷了上面的思考,我們在想,這個逆序多多少少還是有一點不方便,比如在某一個字符串中,我們不想逆序整個字符串,我們只想要逆序一部分,這時候我們上面的函數(shù)適用性就不夠了,所以我們最好將其改成只要傳入兩個地址,就可以逆序這兩個地址之間的字符串,這樣的話,這個函數(shù)就變得很好用了。
代碼如下
#include#includevoid reverse(char* left,char* right)
{
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr, arr + strlen(arr) - 1);
printf("%s", arr);
return 0;
}
??途W(wǎng)運行結(jié)果為
二、字符串逆序(進階)有了上面那到題目作為基礎,我們可以嘗試做一下這道題
鏈接:倒置字符串_牛客題霸_??途W(wǎng)
來源:??途W(wǎng)
這道題我們可以看的出來,是上一道題的進階版,但是根據(jù)我們上一道題的思考之后,這道題其實也沒有那么難,因為我們已經(jīng)創(chuàng)建一個函數(shù),只要傳入兩個地址,就可以逆序這兩個地址之間的字符串。
所以我們的思路就是,先逆序,整個字符串,然后逆序每一個單詞
代碼如下
#include#includevoid reverse(char* left,char* right)
{
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
//逆序整句話
reverse(arr, arr + strlen(arr) - 1);
//逆序每一個單詞
char* p1 = arr;
char* p2 = arr;
while (*p2 != '\0')
{
p1 = p2;
while (*p2 != ' '&&*p2!='\0')
{
p2++;
}
reverse(p1, p2 - 1);
if (*p2 == '\0')
{
break;
}
p2++;
}
printf("%s", arr);
return 0;
}
對于這段代碼的逆序每一個單詞環(huán)節(jié),可能有很多人都有所困惑。為什么是這樣實現(xiàn)的呢?
我們逆序單詞是采用的雙指針的方法。先定義兩個字符指針他們指向字符串的首元素地址,然后我們令p1先不動,p2往下走,只要我的p2不是'\0',自然就可以一直走下去,在里面我們先采用一個while循環(huán),來讓p2 走到單詞的末尾,然后使用逆序函數(shù),逆序這兩者之間的單詞,然后判斷一下p2的里面的值是否為\0,如果此時為\0就不需要進行接下來的步驟了,直接結(jié)束即可。
但是如果此時不為'\0',那么就要繼續(xù)執(zhí)行下去,先讓p2++,讓我們的p2指向下一個單詞的首元素,將下一個單詞的首元素交給p1,然后p2繼續(xù)走下去,這樣循環(huán)下去就可以實現(xiàn)目標了。
??途W(wǎng)運行結(jié)果為
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧