C語言依據用户輸入的數據大小動態開闢內存空間

前言

使用C語言編程時經常需要從各種途徑讀取數據並將其保存在內存中,但C語言為了保持簡潔,所以只包含一些很基礎的數據類型,有時候並不能很好的存儲用户輸入的數據。
例如:需要存儲用户輸入的字符串,通常,教科書上所教的方法是分配一個較大的數組來進行存儲。顯然,這在實際生產環境中是相當不切實際的。
為了相對完美的解決這個問題,我們可以通過動態的開闢堆空間來實現對數據的存儲。

例程簡介

此例程每次接收一個字符,並利用realloc函數根據數據量大小來重新分配堆空間。

例程代碼

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main(void) {
    char tmp = '\0';
    char *str = NULL;
    
    for (int i = 0; true; i++) {
        tmp = getchar();
        
        if ((tmp == '\r') || (tmp == '\n'))
            break; /*每次循環都按照當前數據量大小來重新分配堆空間大小*/
            
        str = (char *) realloc(str, sizeof(str) + sizeof(tmp));
        
        if (str == NULL)
            return -1;
        
        str[i] = tmp;
    }
    
    printf("%s\n", str);
    
    return 0;
}

執行結果

輸入:hello,it7e!!!,程序動態開闢內存存儲字符串並輸出hello,it7e!!!,如下圖。
2018-02-10 17-53-23屏幕截圖.png

Fcitx輸入法第二個候選詞顯示為…的解決方法

問題表現

Fcitx輸入法第二個候選詞顯示為…,因為在輸入狀態下給輸入法截屏不太方便,所以這裏就不放圖啦。

產生的原因

這是因為Fcitx啓用了“雲拼音”導致的,“雲拼音”本該是一個非常方便的一個功能,但Fcitx的“雲拼音”默認使用的是谷歌的服務,由於眾所周知的原因,所以在國內是使用不了的。

解決方法

打開Fcitx的配置窗口,選擇“附加組件”,找到並選中“雲拼音”
2018-02-09 22-18-22屏幕截圖.png
點擊“配置”,找到“Cloud Pinyin Source”(雲拼音源)選項,將其的值改為“Baidu”,默認是“Google”。
2018-02-09 22-20-19屏幕截圖.png
修改後點擊“確定”並關閉FCitx的配置窗口即可。

哎呀,開博滿一年了

剛剛突然想起了,“壞蛋的博客”是在2017年2月1日建立並發表第一篇博文的,而今天是2018年2月2日,滿一歲啦!
來回顧下這一年中取得的成績:

  • 博客日獨立訪客20+
  • 站長工具的百度權重1
  • 博文數量195
  • 百度索引400+
  • ……

雖然以上列出的都不是什麼大的數字,但貴於從無到有的突破。
最初建站時,連續幾個月都看不到一個獨立訪客,長久以來都是隻有我、同學和老師會偶爾瀏覽。使我堅持下來的,不是為了建成一個網站的願望,而是做學習筆記的需要。這也恰恰印證了一句話:“不要為了建站而建站”。

2018年,希望可以取得更加優秀的成績。

minicom報Device /dev/ttyS1 lock failed: Operation not permitted.的解決方法

問題表現

啓動minicom時報如下錯誤:

Device /dev/ttyS1 lock failed: Operation not permitted.

問題產生的原因

這是因為minicom程序沒有被正確關閉,導致串口鎖未被解開,解決辦法自然是終止仍在進行的minicom進程。

解決方法

使用ps命令配合管道命令來查看minicom的進程號。
2018-02-02 09-32-25屏幕截圖.png
如上圖,進程ID是20209,使用kill命令殺死之。

$ sudo kill -9 29209

推薦一個桌面Linux發行版-Linux Mint

對於學習計算機的同學來講,裝一個Linux來作為日常使用的操作系統是再好不過的事了。但Linux下的發行版本眾多,如何選擇一個適合自己的發行版就成了一門學問。
這裏我個人推薦下Linux Mint,這個發行版基本做到了“開箱即用”,完全不需要像Fedora那樣折騰,又不會時不時出現Ubuntu下惱人的各種系統崩潰,其易用性僅次於deepin而又不似deepin那樣BUG無數。
同時,Linux Mint對筆記本等高分辨率的屏幕支持比較好,這也是我選擇這一發行版的重要原因。

Linux Mint除了集成了大量實用的工具外還自主開發了一些很好用的東西,例如:
一鍵清理軟件包卸載後的殘留配置。
2018-02-01 11-45-54屏幕截圖.png
第一次啓動系統時彈出來的“歡迎界面”。
2018-02-01 11-47-46屏幕截圖.png
以及算不上美觀,也沒有什麼帥炸了的特效,但足夠方便好用的Cinnamon桌面環境~
2018-02-01 12-01-16屏幕截圖.png

簡而言之,Linux Mint是我接觸Linux以來最滿意的一個發行版,我對她的評價是:真正的易用、實用。

2018年3月14日補充:

Linux Mint的軟件倉庫中的軟件包版本簡直是上古時代的。。。

18年1月25日記

18年1月25日記
天氣:晴,但是真的冷阿

早上在機房收拾自己的東西的時候,意外地發現了一包魔法式乾脆面!是一塊錢一包的那種,不是五毛!
我開心極了,捧着這上天的恩賜,蹦蹦跳跳地跑去高考科,打算把這珍貴的乾脆面送給心儀的姑娘。
心裏打着小算盤:今早老師都去開會了,説不定一會還能捏捏姑娘粉嘟嘟的小臉蛋呢!
可是,誰能告訴我,到底是為什麼:全校的老師都去開會了,為什麼!到底是為什麼!高考科還留了一個老師值班?最重要的是,我為什麼這麼倒黴的和她老人家撞了個滿懷?
她老人家逮住我就是一頓盤問“你從哪來?來幹什麼?為什麼鬼鬼祟祟的?看到老師躲什麼?”,“老師,我是技能小組的,回來拿東西”我支支吾吾地應付。本以為她會放我一馬,可是……“行!讓你拿東西,我陪你拿,給你兩分鐘時間!”。“陪”!?
就這樣,她替我推開了本該由我開開心心地推開的班級的大門(好在開的是班級後面的門)。
我和老人家的對話打破了班裏原本的寧靜,同學們像看外來入侵物種一樣一臉新奇地抬頭望着我。想想身後站着的老傢伙和再看看面前幾十雙善良的小眼睛,我的心中彷彿有一萬匹草尼馬在奔騰。
在那一瞬間,我能感受到的只有:茫然,失措與驚慌。
可是,男孩子,勇敢一些嘛,我就是喜歡人家,送個東西有錯嗎???又沒有不文明交往(此處應有滑稽的表情)。
鼓起勇氣,小心翼翼地走到姑娘的座位旁,扔下方便麪説了句“給你包方便麪”,馬上回頭看了看站在門口的老傢伙。當然,我不是怕老傢伙吃醋,只是看看此時她臉上有沒有發黑~
咦,她在往門外看耶!美滋滋的我邁着美滋滋的小碎步快速移到門口,説了句“我拿完東西了,老師再見”,然後真的是一溜煙地溜跑了。

解決Ubuntu下無法使用pthread庫的問題(加-lpthread也不好使的情況)

導語

這個問題困擾了我很久,因為寫一個飛機大戰的小遊戲需要用到多線程。看到Linux下的多線程可以用pthread.h庫來實現,但該庫不是C的標準庫,所以編譯的時候要加上-lpthread,可是,為在我的Ubuntu 16.04下如此編譯的結果是報了這個錯誤:

/usr/bin/ld: 找不到 -lphtread
collect2: error: ld returned 1 exit status

為了解決這個問題,我在網上苦苦地搜了很久很久,最後無奈地發現:網上現有的文章基本上都是抄來抄去,全是胡言亂語。。。

正確的解決辦法

安裝manpages-posix軟件包即可。

$ sudo apt install manpages-posix

再次編譯即可通過!

Atom安裝插件失敗的解決方法

前言

心血來潮,突然想換一個代碼編輯器,在百度上搜來搜去看中了Atom。不過這傢伙默認是英文界面,想切換成中文還要再安裝一個漢化插件,而問題也由此而來。。。

問題表現

安裝插件時提示如下錯誤:

Installing “simplified-chinese-menu@5.3.5” failed.Hide output…
gyp info it worked if it ends with ok
gyp info using node-gyp@3.4.0
gyp info using node@6.9.5 | win32 | x64
gyp http GET https://atom.io/download/electron/v1.6.15/iojs-v1.6.15.tar.gz
gyp WARN install got an error, rolling back install
gyp ERR! install error
gyp ERR! stack Error: connect ECONNREFUSED 52.216.80.64:443
gyp ERR! stack     at Object.exports._errnoException (util.js:1022:11)
gyp ERR! stack     at exports._exceptionWithHostPort (util.js:1045:20)
gyp ERR! stack     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1087:14)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "C:\\Users\\huaidan\\AppData\\Local\\atom\\app-1.23.3\\resources\\app\\apm\\bin\\node.exe" "C:\\Users\\huaidan\\AppData\\Local\\atom\\app-1.23.3\\resources\\app\\apm\\node_modules\\node-gyp\\bin\\node-gyp.js" "install" "--runtime=electron" "--target=1.6.15" "--dist-url=https://atom.io/download/electron" "--arch=x64" "--ensure"
gyp ERR! cwd C:\Users\huaidan\.atom
gyp ERR! node -v v6.9.5
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok
Compiler tools not found
Packages that depend on modules that contain C/C++ code will fail to install.
Read here for instructions on installing Python and Visual Studio.
Run apm install --check after installing to test compiling a native module.

問題原因

這個問題其實是偉大的社會主義和諧牆導致的,當然,我不是批評和諧牆,也不是説和諧牆不好,只是和諧牆有時候可能會誤傷一些正規站點,讓人很無奈,而且還不許搭梯子。。。

解決方法:

打開CMD命令提示符(Linux下則打開shell,執行的命令都是相同的)。

C:\>apm config set registry https://registry.npm.taobao.org //切換npm源為國內源
C:\>apm install //安裝環境軟件
Installing modules done //提示安裝成功

此時再次返回Atom中安裝插件即可成功。

Ubuntu安裝GCC7.2

$sudo add-apt-repository ppa:ubuntu-toolchain-r/test # 添加ppa源
$sudo apt-get update # 更新軟件列表
$sudo apt-get install gcc-7 # 安裝GCC7.2

成功安裝後使用`gcc-7`命令調用GCC7.2編譯器。直接使用`gcc`命令將調用系統原本的GCC編譯器。 如果想將默認編譯器換成GCC7.2則執行如下命令:

$sudo rm -f /usr/bin/gcc # 刪除原本的軟連接
$sudo ln /usr/bin/gcc-7 /usr/bin/gcc # 創建指向gcc-7的軟連接

如果不想保留舊版本的編譯器則執行如下命令:

$sudo apt-get remove gcc-5 && apt-get autoremove # 卸載gcc-5並卸載掉不再需要的依賴包
$sudo ln /usr/bin/gcc-7 /usr/bin/gcc # 因為卸載GCC時會自動刪除/usr/bin/gcc鏈接,所以這裏需要再次創建

我對C語言中字符串指針的一個誤解

在QQ羣中看到一道C語言題:

定義char a[10]和char *p=a,下面的賦值語句中,正確的是___
A. a[10]=”Turbo C” B. p=”Turbo C”
C. a=”Turbo C” D. *p=”Turbo C”

這道題選B本身是沒有任何值得疑惑的地方的,但是,且看我下面這個小程序。

#include<stdio.h>
int main(void) {
    char a[10];
    char *p = a;
    p = "Turbo C";
    printf("%s\n", a); //這裏我打印的是數組a而不是指針p
    return 0;
}

在Linux下編譯執行後輸出亂碼,這個錯誤是因為我一開始以為:p = “Turbo C”是將”Turbo C”這個字符串賦值給了p所指向的字符數組a。
實際上,p = “Turbo C”這條語句在執行時做了三件事。

  1. 在內存中創建了一個常量空間,用於存放字符串
  2. 在字符串末尾添加了一個/0
  3. 返回字符串在內存中存放位置的首地址給p指針

所以,p指針中所保存的內容已經由字符數組a的首地址變為了字符串”Turbo C”的首地址,想當然的,字符串”Turbo C”也並未被賦值給字符數組a,而是存在於新的內存空間中。
此時我再用printf輸出字符數組a的內容就會打印出一些亂七八糟的東西啦——因為我沒有給數組a初始化,只有天才曉得編譯器在裏面填了什麼東東~

那麼上面那道程序這樣改一下就正常工作啦:
將第7行改為

printf("%s\n", p);

手機一樣可以拍出美麗的星空照片

昨晚在奶奶家的平房上,我抬頭看着星星發呆:小星星,像眼睛一樣眨呀眨,一閃一閃亮晶晶~
索性掏出手機記錄下了這一刻的星空。

  • 拍攝工具:小米5s
  • 光圈:f2.0
  • 焦距:無限遠
  • 感光度:ISO1600
  • 快門時間:32秒
  • 地點:山東省威海市榮成市光祿寨村

IMG_20180106_180010.jpg

第一次拍星空,看到照片時我簡直不敢相信竟然會這樣清晰,本以為會黑乎乎一團呢。
看來小米5s的“暗夜之眼”稱號真的不是白得的。

解決因gravatar頭像加載慢而拖累typecho訪問速度的問題

前言

gravatar是互聯網中很常用的頭像庫,但受限於天朝獨特的網絡環境,所以在天朝範圍內訪問起來有點“難受”,本文將介紹解決gravatar頭像加載慢而拖累typecho的問題的方法。

解決問題的思路

利用七牛雲存儲來緩存gravatar頭像,並將typecho程序調用gravatar頭像的地址改為七牛雲存儲的自定義域名。

步驟

七牛雲存儲設置部分

PS:本文不對細節做詳細解釋,僅概述步驟

1、註冊七牛雲賬號
2、創建一個公共存儲空間
3、設置鏡像源為“https://secure.gravatar.com/
4、綁定自定義域名並按需求決定是否啓用HTTPS訪問

typecho設置部分

用文本編輯器打開typecho程序的/var/Typecho/Common.php文件,轉到第937行,將“https://secure.gravatar.com/”修改為自己七牛雲存儲域名。

typecho中替換gravatar頭像的加載地址

最後,多刷新幾下頁面,是不是速度快了很多?如果在過程中遇到什麼問題歡迎在文章下方留言哦~

解決Win10中Linux子系統的控制枱字體修改後重啓控制枱復原的問題

前言

聽説Win10內置了Linux子系統,這可把我高興壞了————再也不用有事沒事掛着個虛擬機了!
懷着激動的心情在我的電腦上配置好這項功能之後,卻發現Windows控制枱的那令人看着頭皮發麻的噁心字體真是刺的我眼睛疼,毫無Ubuntu原生桌面環境下Shell終端字體的美感。

失敗的嘗試

emmm…改一個字體吧,雖然我不喜歡折騰,但默認的新宋體實在是超出了我的忍耐極限。

修改Win10子系統的控制枱字體

but,改完字體後我重啓了下控制枱,為什麼又回到了令人生厭的新宋體?一臉懵逼的我反反覆覆改了三遍。

比較完美的解決方法

不得已只好求助於度娘,找到如下解決辦法:
安裝Microsoft YaHei Mono字體,該字體是微軟雅黑和consolas字體的集合(個人感覺很漂亮哦)。

安裝後的效果圖

Microsoft YaHei Mono字體效果圖

下載及安裝Microsoft YaHei Mono字體

點我下載Microsoft YaHei Mono字體

下載後解壓壓縮包,雙擊字體文件,點擊“安裝”即可。
Q8ARCCH4@Q`PAW$U8D1V$F1.png

補充

Microsoft YaHei Mono字體的英文字符寬度比consolas字體窄了一個像素,如果看着礙眼可以將字體大小從16改成17。