日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

秒,在解答这个C语言题目上,我们都败了

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秒,在解答这个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语言题目上,我们都败了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。