鳥類天堂:
公司主營業(yè)務:成都網站制作、成都網站建設、外貿營銷網站建設、移動網站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現互聯網宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯推出慈溪免費做網站回饋大家。?🦢一:函數類型的對應
🦜代碼呈現:
? 🦢二:浮點數運算
? 🦢三:scanf的使用
?🦩?NUM 1:遇見空格,回車符,制表符,結束。
?🦩 NUM 2:達到域寬結束
?🦩 NUM 3:輸入非法字符結束
??🦩 NUM 4:結束之后的回車會存儲在緩沖區(qū)
??🦜代碼呈現:
? 🦢四:異或操作符的妙用
??🐦 NUM 1:找單身狗問題
??🦜代碼呈現:
🐦 NUM 2:尋找缺失的數字
?🦜代碼呈現:
🦢五:“字符串”部分移動
? 🐦倒序字符串
? 🦚簡易方法一
? 🦜代碼呈現 :
? 🦚簡易方法二
??🦜代碼呈現 :
?🐦旋轉數組:
🦜代碼呈現 :
? 🌻歡迎各位伙伴們來到我們以C語言為專題的冷知識課堂,每系列的博客當中都會抽取五個最易錯的冷知識和大家分享,快去看看吧!?
?🦢一:函數類型的對應? 🐌(1)在編寫代碼的時候一定要注意函數的返回類型是否和自己標明的一致,函數并不會檢查所有類型不匹配的問題,如整形和浮點型不匹配只會報一個警告,極容易被忽略。之前我定義過一個函數,我定義函數的返回類型應該是int但是卻將一個浮點數直接返回了,使得1.78-1.23的時候雖然結果是0.55,但是經過強制類型轉換float->int之后就變成了0。導致程序運行出現錯誤。
? 🐌我們需要將函數的類型改為浮點型值后才可以正確計算。?
? 🐌如上圖的運行結果所示。
🦜代碼呈現://#include//
減法函數
//int sub(double a, double b)
//{
// return a - b;
//}
//
//int main()
//{
// double a = 0.0, b = 0.0;
// scanf("%lf %lf", &a, &b);
// double ret=sub(a,b);
// printf("%.2lf", ret);
// return 0;
//}
#include//減法函數
double sub(double a, double b)
{
return a - b;
}
int main()
{
double a = 0.0, b = 0.0;
scanf("%lf %lf", &a, &b);
double ret = sub(a, b);
printf("%.2lf", ret);
return 0;
}
? 🦢二:浮點數運算? 🐌(2)浮點數的比較只可以運用一定的范圍進行比較,如果大家去查閱資料的話,官方的比較浮點數的方法肯定都是范圍比較。范圍比較的含義也就是:想要判斷兩個浮點數誰大誰小,那么就需要把這兩個浮點數相減去和自定義的 “0” 進行比較,也就是我們需要將兩數之差和1e-7進行比較(1e-7在浮點數的精確度上等于0)。官方的解釋是:浮點數并非真正意義上的數字,只是其在某種范圍內的近似。因此也就只能用近似的方法將實數與0進行比較。 這個在超過七位小數運算與0比較上值得大家注意。(7位之后是隨機數不一定為0),我們可以利用一個實例來理解這部分的知識。
就像是 上圖中我們看到的結果一樣,并不是所有的浮點數在內存中儲存的都是我們輸入的準確值,那么我們上面的浮點數需要進行范圍比較的說法就容易理解得多了。浮點數在內存中的存儲請參考:http://t.csdn.cn/7MFlV
? 🦢三:scanf的使用? 🐌(3)關于 scanf 值得我們注意的是 scanf 的讀取結束判定條件,以及結束后的注意事項。
?🦩?NUM 1:遇見空格,回車符,制表符,結束。? 🐌也就是說當你需要輸入一個字符串的時候,如果字符串中存在空格,制表符,(可以產生四個空格),回車,對于 scanf 可能無法正常讀取,遇到這三種符號會自動判定第一次輸入結束。通常我們可以利用 gets 進行替代 scanf 對存在空格等特殊符號的字符串進行輸入。
?🦩 NUM 2:達到域寬結束? 🐌雖然很少,但是我們刷題的時候也會看到輸入的數字等數據是一行輸入且沒有空格等分割標志,那么我們就需要限定域寬對輸入的兩個或多個數據進行限定。如:我想輸入12和34,但是輸入的卻是1234這時候我們就需要將我們 scanf 中的內容改為 sacnf("%2d%2d",&a,&b); 這樣我們的scanf 進行數據讀取的時候就會讀到兩位之后自動判定輸入為下一個數字。
?🦩 NUM 3:輸入非法字符結束? 🐌當我們使用 sacnf 的時候我們一般都會有特定要求的輸入格式,比如:輸入一個整型就是 %d,那么我們在鍵盤上輸入的只能是連續(xù)的數字,否則也會異常結束。就像我們想要輸入一個數字1234,但是我們再輸入的時候卻一不小心打錯了,打成了12e4,這個時候我們輸入的數字就變成了 12 。讀到字符 e 的時候由于 e 不屬于整形所以 scanf 判定輸入結束。
??🦩 NUM 4:結束之后的回車會存儲在緩沖區(qū)? 🐌當我們輸入數據結束的時候一般都會輸入回車來告訴程序,我已經輸入完畢了,你可以開始運行了。但是我們需要特別注意的是,這個回車僅僅是告訴程序開始執(zhí)行后就消失了嗎?不,它會停留在緩沖區(qū)中。等待下一次被喚醒,就一個簡單的例子:當我們需要分兩次輸入的時候第一次輸入一個整數,第二次輸入一個字符,那么我們必須對這個回車符進行處理了。我們用一個程序來證明。
? 🐌我們可以看出的程序似乎出現了異常,第一次輸入一個整型 45 之后原本應該再一次進行輸入一個字符的,但是系統(tǒng)卻異常結束了,中間還空了一行。這就驗證了我們上面所說的,我們在輸入第一個整形的時候殘留下的一個回車并沒有消失,下次讀取一個字符并打印的時候會先讀取回車。(但是不要擔心,假如你想輸入的第二個數據不是字符的話,那么不用考慮這個回車符,因為scanf 會自動匹配到第一個符合的數據進行輸出。) 如果出現這種情況的話,可以利用 getchar 函數進行讀取一個字符,我們將緩沖區(qū)的回車拿走之后就不會出現這種情況了。如下圖。
??🦜代碼呈現://scanf不會刪除輸入的回車符證明:
//#include//int main()
//{
// int n = 0;
// char ch = 0;
//
// scanf("%d", &n);
// printf("%d", n);
//
// scanf("%c", &ch);
// printf("%c", ch);
//
// return 0;
//}
//解決辦法:
#includeint main()
{
int n = 0;
char ch = 0;
scanf("%d", &n);
printf("%d\n", n);
getchar(); //拿走回車
scanf("%c", &ch);
printf("%c", ch);
return 0;
}
? 🦢四:異或操作符的妙用? 🐌在刷題的過程中你經常會被一些很奇特的思想所震驚到,異或操作符就是其中之一。所謂的異或就是將兩個存儲在內存中的數據按位進行操作。兩個數據依次對其,每一位上的數字相等就為0,不相等就為1。例如:
? 🐌但是你看到這里肯定一頭霧水:這有什么用呀?別著急,這需要涉及異或操作符的一個特性,連續(xù)操作同一個數字時還會變成原來的數。
🐌那么接下來的內容就有趣了,我們可以利用異或操作符的這個性質做許多事,比如說加密,找到數組中的重復的數字,找落單的數字,對 1—N 無序數列找出缺失的數字等等。我們通過幾道題目來體會一下其中的奧秘。
??🐦 NUM 1:找單身狗問題? 🐌這個題目的要求是這樣的:有一個數組中的數字總是成對存在,但是有一個數字卻只有一個,那么請找出這個數字。要是我們不適用異或的方法會怎么求解呢?循環(huán)嵌套之后一個一個匹配?這不免效率太慢了,但是我們要是使用異或操作符進行求解的話只需要進行一遍。就可以得到想要的答案。
? 🐌我們經過嘗試可以發(fā)現0無論異或任何數字得到的結果都會是這個數字,那么我們就可以利用這個性質對數組進行操作。是不是一下子變得很簡單?
??
??🦜代碼呈現:? 🐌那么我們的問題是不是得到了解決?簡單了不少吧?別著急精彩的還在后面!
🐦 NUM 2:尋找缺失的數字? 🐌這道題的題目要求是這樣的:從 1—N一共N個數字亂序存儲在一個數組中,但是存儲的時候不小心漏掉了一個數字,請找出漏掉的這個數字??吹竭@個題目的時候別著急取用循環(huán)嵌套,看咱們的大標題!異或操作符呀!但是你可能會說這里沒有的數字呀?沒有槍沒有炮我們自己造!我們可以先使用0進行從1—N進行第一遍異或,之后將之后的結果再和數組中的數字異或,這么一來不是又出現落單的數字了嗎?我們按照這個思路來執(zhí)行我們的操作。
? 🐌這么一簡化,是不是程序變得更加簡潔了?編寫思路也更加清晰了呢?那么下一次再遇到對數組中的數字進行修改的問題記得優(yōu)先考慮異或哦!
?🦜代碼呈現:#includeint main()
{
//N為20 缺失的數字是 14
int arr[20] = { 3,2,5,4,7,9,8,1,6,10,13,16,12,15,18,19,17,20,11 };
int n = 20, i = 0, res = 0;
for (i = 1; i<= n; i++)
{
res ^= i;
res ^= arr[i-1];
}
printf("%d", res);
return 0;
}
🦢五:“字符串”部分移動
? ? 🐦倒序字符串? 🐌還記得我們之前說到的我第一次oj考試嗎?上面有一道字符串逆序的題目,我當時傻傻的使用 getchar 進行一個字符串一個字符串的讀取,導致那道題我到最后時間到了也沒有寫完,現在想想真的好傻,那我們就利用這道題來給大家講講一個更加簡單的思想:“字符串”的部分逆序。題目如下:
? 🐌拿到這道題的時候是不是覺得思路很簡單,但是好復雜?先創(chuàng)建三個數組?將三個單詞分別裝起來?NO,NO,NO,題目中可沒說每次測驗只對三個單詞進行位置轉換。怎么樣?一下子被難住了?那么我們接下來看一種奇特的思想:
? 🦚簡易方法一?🐌對于這種部分前置的題目我們可以先對部分進行逆序操作,在對整體進行逆序操作。示例如下:
?🐌是不是很神奇?我第一次也是這么覺得的,難以置信!這是怎么想出來的!沒辦法總有一些大佬能想到好的方法,我們只需要對這種方法進行學習即可。那么在遇到對部分進行不調換順序前置的情況我們就可以利用這種方式進行操作。記住先部分逆序,再整體逆序。下面我們將上面的思想轉化為代碼的形式:
? 🦜代碼呈現 :#include#includeint main()
{
char ch[100] = { 0 };
gets(ch); //像靜態(tài)區(qū)中輸入字符串包括空格
int i = 0, left = 0, right = 0;
char tmp = 0;
int len = strlen(ch);
//對部分進行逆序
for (i = 0; i< len; i++)
{
if ((ch[i] == ' ')||(i==(len-1)))
{
if (ch[i] == ' ')
{
right = i-1;
}
else
{
right = i;
}
//對下標為left到i-1的單詞進行逆序
for (; left
? 🦚簡易方法二? 🐌雖然上面的思路有了,但是是不是感覺還是有點復雜?我第一次編寫這個代碼的時候調試錯誤調試了好幾個小時,總會忽略一些細節(jié)。那么覺得麻煩的話我再來給大家介紹一種方法:部分倒置的時候肯定得有一個標志吧?讓字符串從后向前查找,找到這個標志對后面字符串中的內容直接打印。如下:
🐌這樣的話我們就可以將我們的第二次兩次逆序操作都省去了,怎么樣?這次夠簡單了吧?
? 🐌運行效果和想象的一樣。那么接下來就將代碼呈現給大家:
??🦜代碼呈現 :#include#includeint main()
{
char a[1000];
int len = 0, i = 0, j = 0;
gets_s(a);
len = strlen(a);
for (i = len - 1; i >= 0; i--)
{
if (a[i] == ' ')
{
for (j = i + 1; a[j] != '\0' && a[j] != ' '; j++)
{
printf("%c", a[j]);
}
printf(" ");
}
}
i = 0;
while (a[i] != ' ')
{
i++;
}
for (j = 0; j< i; j++)
{
printf("%c", a[j]);
}
return 0;
}
?🐦旋轉數組:🐌是不是感覺一道題做起來不過癮?我們接著看一道類似的題目:旋轉數組:給定一個數組arr[7]={1,2,3,4,5,6,7},旋轉N次,求旋轉之后的數組是什么樣的。(旋轉指的是將數組中的最后一個數字拿到第一個數字的位置上,其他數字向后移,例:旋轉一次:7,1,2,3,4,5,6)你可能沒發(fā)現這道題和我們前面講的旋轉數組有什么區(qū)別,但是仔細解析一下就會恍然大悟,把旋轉的次數作為數組的個數,從后向前進行計數,然后直接打印。例如:
? 🐌這么一來我們就可以用我們的老方法進行求解這道題了,簡單又高效!只不過需要注意的是我們每旋轉七次都是一個循環(huán),數組會恢復到原本的樣子,因此我們需要對輸入的旋轉的次數進行取余操作,防止運行出錯。我們程序的編寫效果如下:
🦜代碼呈現 :#includeint main()
{
int arr[7] = { 1,2,3,4,5,6,7 };
int n = 0, i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
printf("請輸入旋轉的次數:");
scanf("%d", &n);
n %= 7;
for (i = 0; i< n; i++)
{
printf("%d ", arr[sz-n+i]);
}
for (i = 0; i< sz - n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
?🐌那么本次介紹的五個使用小技巧也就到此為止了,感謝您的觀看,祝您天天開心。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧