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。