秒,在解答这个C语言题目上,我们都败了
看這篇文章之前,我覺得可以先看看下面這篇文章?
看printk引發的一點思考
不管我們用的printk還是printf,它們的核心都是可變參數的函數,所以可以拼接很多參數傳遞給函數實體,然后函數實體里面可以通過某種方式解析這些參數。
看看這個題目
過濾一組數據,要求過濾之后頭尾部都沒有',' ,而且也不能用if 語句來實現。
例如、 輸入:a[6]={1,2,3,4,5,6} 輸出:1,2,3,4,5,6
使用if?實現之
正常的寫法是用到 if 的,已經背離了題目的要求。
不過,我說下自己對這個問題的看法,我們在做項目做需求的時候,產品經理每天拿著刀在后面威逼利誘著,已經是火燒眉毛的事情,能做出對方想要的要求已經是不易了,哪里有時間去思考那些浮夸的寫法。
這也是做科研和做項目的不同,我寫文章,做分享,是懷著深耕去的,但是做項目,我們是需要把控時間節點的,每個人站在不同的角度,就會看到不同的哈姆雷特。
#include<stdio.h>int?main() {int?arr[6]?=?{1,2,3,4,5,6};int?is_first?=?1;int?i?=?0;?for(i?=?0;?i?<?6;?i++){if(is_first){printf("%d",arr[i]);is_first?=?0;}else?{printf(",%d",arr[i]);}}return?0; }大神的寫法
這代碼來源于知乎的一個題主,他在回答中分享了這個寫法,非常巧妙。
#include?<stdio.h> int?main(void)?{int?a[6]?=?{1,?2,?3,?4,?5,?6},?i;for?(i?=?0;?i?<?6;?i++)?{printf(",%d"?+?!i,?a[i]);}return?0; }https://www.zhihu.com/question/412135686/answer/1396323238
先不解釋
我們看看printf函數原型
typedef?char?*va_list;#define???_AUPBND????????(sizeof?(acpi_native_int)?-?1) #define???_ADNBND????????(sizeof?(acpi_native_int)?-?1)#define?_bnd(X,?bnd)?(((sizeof?(X))?+?(bnd))?&?(~(bnd))) #define?va_arg(ap,?T)?(*(T?*)(((ap)?+=?(_bnd?(T,?_AUPBND)))?-?(_bnd?(T,_ADNBND)))) #define?va_end(ap)????(void)?0 #define?va_start(ap,?A)?(void)?((ap)?=?(((char?*)?&(A))?+?(_bnd?(A,_AUPBND))))//start.c static?char?sprint_buf[1024]; int?printf(char?*fmt,?...) {va_list?args;int?n;va_start(args,?fmt);n?=?vsprintf(sprint_buf,?fmt,?args);va_end(args);write(stdout,?sprint_buf,?n);return?n; }里面的幾個宏作用我在之前的文章里面也有有提到。
關于va_list ,我寫了一個實例,比較簡單
#include?<stdlib.h> #include?<stdio.h> #include?<string.h>#include?<stdarg.h>int?sum(int?size,?...) {va_list?vp;int?s?=?0;int?i?=?0;va_start(vp,?size);for?(i?=?0;?i?<?size;?++?i)?{s?+=?va_arg(vp,?int);printf("%d\n",?s);}va_end(vp);printf("%d,%d\n",?size,?s); }int?main() {sum(5,?20,?30,?40,?50,?20);return?0; }輸出
20 50 90 140 160 5,160-------------------------------- Process?exited?after?0.08141?seconds?with?return?value?0 請按任意鍵繼續.?.?.跟上面例子不同之處在于,printf 函數傳入的是字符串,既然是字符串,那就離不開指針「地址」,既然是指針,就離不開指針的指向位置這個問題。
先舉個例子
#include?<stdio.h>int?strput(char?*?str) {printf("%s\n",str); }int?main() {strput("Linux"+1);return?0; }輸出
inux-------------------------------- Process?exited?after?0.08051?seconds?with?return?value?0 請按任意鍵繼續.?.?.如果能明白上面的問題這個例子的話,拿對前面那個代碼再拿過來瞧瞧,應該就會有一種豁然開朗的感覺了。
#include?<stdio.h> int?main(void)?{int?a[6]?=?{1,?2,?3,?4,?5,?6},?i;for?(i?=?0;?i?<?6;?i++)?{printf(",%d"?+?!i,?a[i]);}return?0; }首先
",%d"?+?!i是一個字符串的地址,這個地址 通過 i 來對它進行了偏移。
如果是第一個數組,i 對應的值是 0,所以就不會打印出 「 , 」這個字符了。
? 推薦閱讀:
? ??專輯|Linux文章匯總
? ??專輯|程序人生
? ??專輯|C語言
嵌入式Linux
微信掃描二維碼,關注我的公眾號?
總結
以上是生活随笔為你收集整理的秒,在解答这个C语言题目上,我们都败了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu环境下,反编译工具Apkto
- 下一篇: 新坑:基于AD9361的手持监测侦察接收