明解C语言
本文为阅读书籍《明解C语言-中级篇》所积累的知识点及编译书本代码时遇到的问题。部分对应代码在\Code_2018\BK_明解C语言
目录下。每个代码内都含有程序功能、思路、疑惑点等内容,如有疑问指出。
rand()
- 头文件:
#include<stdlib.h>
- 格式:
int rand(void);
- 功能:生成伪随机数,基于种子值(
seed
,默认为1),按照特定规律生成的随机数 - 代码示例:随机数生成.cpp
srand()
- 头文件:
#include<stdlib.h>
- 格式:
void srand(unsigned seed);
- 功能:给后续调用的
rand()
设置种子(seed
),用于生成新的伪随机数序列 - 代码示例:随机数生成.cpp
- 备注:常把时间当种子,
srand(time(NULL))
clock()
- 头文件:
#include<time.h>
- 格式:
clock_t clock(void);
- 功能:求处理器调用某个进程所花费的时间(设定起点终点算差值)
- 返回值:从定义与程序启动相关的编程环境的时间点起,用处理器系统的最佳逼近返回程序占用处理器的时间。为了以秒为计量单位,需要将返回值除以
CLOCK_PER_SEC
宏的值(默认为1000)。如果无法获取处理器调用该进程所花费的时间,或者无法显示数值,就返回(clock_t)-1
- 代码示例:计算处理所需时间.cpp
isprint()
- 头文件:
#include<ctype.h>
- 格式:
int isprint(int c)
- 功能:判断c是否为含有空白字符
(' ')
的显示字符 - 返回值:如果判断成立,就返回0以外的值(真),否则返回0
- 代码示例:简单猜拳游戏_switch语句.cpp
把字符型转换为数值
atoi()
:将你输入的字符串形式的整数转为int
型atol()
:将你输入的字符串形式的整数转换为long
型atof()
:将你输入的字符串形式的整数转换为double
型- 代码示例:字符串转换为数值.cpp
字符类别的判断
iscntrl
:控制字符isspace
:空白字符isprint
:显示字符isdigit
:十进制数字isxdigit
:十六进制数字isgraph
:除空白符以外的显示字符issupper
:大写英文字母islower
:小写英文字母isalpha
:英文字母isalnum
:英文字符或数字字符ispunct
:除空白符、数字字符、英文字符以外的显示字符上述任何一个函数只要判断成立就返回除0以外的值,不成立则返回0
数字字符和数值间的转换
整数值x(0~9) --- x+'0'-->数字字符c('0'~'9')
整数值x(0~9) <-- c-'0'---数字字符c('0'~'9')
strcmp()
- 头文件:
#include<string.h>
- 格式:
int strcmp(const char *s1, const char *s2);
- 功能:比较s1所指的字符串和s2所指的字符串的大小关系(从第一个字符开始逐一比较,当出现不同的字符时,以这对不同字符的大小关系为准)
- 返回值:若s1和s2相等返回0;若s1大于s2则返回正值;若s1小于s2则返回负值
strncmp()
- 头文件:
include<string.h>
- 格式:
int strncmp(const char *s1, const char *s2, size_t);
- 功能:比较s1所指额字符串和s2所指额字符串的前n个字符的大小关系(从第一个字符开始逐一比较,当出现不同的字符时,以这对不同字符的大小关系为准)
- 返回值:若s1和s2相等返回0;若s1大于s2则返回正值;若s1小于s2则返回负值
strcpy()
- 头文件:
#include<string.h>
- 格式:
char *strcpy(char *s1, const char *s2);
- 功能:把s2指向的字符串复制到s1所指向的数组。当 s2与s1重叠时,作未定义处理
- 返回值:返回s1的值
strcat()
- 头文件:
#include<string.h>
- 格式:
char *strcat(char *s1, const char *s2);
- 功能:把s2指向的字符串复制到s1指向的数组的末尾。当 s2与s1 重叠时,作未定义处理
- 代码示例:显示某几个月的日历.cpp
scanf()
- 头文件:
#include<stdio.h>
- 格式:
int scanf(const char * restrict format,...);
- 功能:格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
- 说明:函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。(在实际编程中传入的地址容易搞错)
- 返回值:
scanf
函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF - 代码示例:为整数数组动态分配储存空间.cpp
- 此外有例如
scanf("%*s")
的格式,* 是scanf函数中的一种修饰符,表示输入项输入后不转送给任何向量
,解析:c语言中 scanf("%*s"); 的具体意思
calloc()
- 头文件:
#include<stdlib.h>
- 格式:
void *calloc(size_t nmemb, size_T size);
- 功能:为nmemb个大小为size字节的对象分配储存空间,该空间的所有位都会初始化为0
- 返回值:若分配成功,则返回一个指向已分配的空间的开头的指针;若分配失败,则返回空指针
- 代码示例:为整数数组动态分配储存空间.cpp
malloc()
- 头文件:
#include<stdlib.h>
- 格式:
void *malloc(size_t size);
- 功能:为大小为size字节的对象分配储存空间,此储存空间的初始值不确定
- 返回值:若分配成功,则返回一个指向已分配的空间的开头的指针;若分配失败,则返回空指针
- 代码示例:把键盘输入的值存入动态分配的储存空间.cpp
free()
- 头文件:
#include<stdlib.h>
- 格式:
void free(void *ptr);
- 功能:释放ptr所指向的空间,让这部分空间能继续用于之后的动态分配
- 返回值:无
- 代码示例:把键盘输入的值存入动态分配的储存空间.cpp
time()
- 头文件:
#include<time.h>
- 格式:
time_t time(time_t *timer);
- 功能:决定当前的日历时间。未定义该值得表现形式
- 返回值:用所在编程环境中的最佳逼近返回求出的日历时间。若日历时间无效则返回值
(time_t)-1
,当timer不为空指针时,将返回赋给timer指向的对象 - 代码示例:显示当前时间_显示结构体信息
- 几种时间类型示意图:几种时间类型.jpg
localtime()
- 头文件:
#include<time.h>
- 格式:
struct tm *localtime(const time_t *timer);
- 功能:把timer指向的日历时间转换成本地时间表示分解时间
- 返回值:返回指向转换后的对象的指针
- 代码示例:显示当前时间_显示结构体信息
gmtime()
- 头文件:
#include<time.h>
- 格式:
struct tm *gmtime(const time_t *timer);
- 功能:把timer指向的日历时间转换成协调世界时表示的分解时间
- 返回值:返回指向转换后的对象的指针
- 代码示例:显示当前时间(协调世界时UTC格式)
asctime()
- 头文件:
#include<time.h>
- 格式:
char *asctime(const struct tm *timeptr);
- 功能:把timeptr指向的结构体的分解时间转换成这种形式的字符串
Sun Sep 12 13:02:41 2018\n\0
- 返回值:返回指向转换后的对象的指针
- 代码示例:显示当前时间(asctime函数)
ctime()
- 头文件:
#include<time.h>
- 格式:
char *ctime(const time_t *timer);
- 功能:把
timer
指向的日历时间转换成与asctime
函数具有相同字符串形式的本地时间,等价于asctime(localtime(timer))
- 返回值:返回以分解时间为实际参数的
asctime
函数返回的指针
difftime()
- 头文件:
#include<time.h>
- 格式:
double difftime(time_t time1, time_t time0);
- 功能:计算两个日历时间的差time1-time0
- 返回值:以秒为单位表示求得的时间差,将其作为double型返回
mktime()
- 头文件:
#include<time.h>
- 格式:
time_t mktime(struct tm *timeptr);
- 功能:把表示timeptr指向的结构体中的本地时间的分解时间转换成与timer函数的返回值具有相同表现形式的日历时间。忽略结构体 tm_wday与tm_yday元素的值。
- 返回值:把指定的分解时间转换成time_t型的值得表现形式并返回。当无法用日历时间表示时,函数会返回值(time_t)-1
- 代码示例:求星期几(mktime函数)
sprintf()
- 头文件:
#include<stdio.h>
- 格式:
int sprintf(char *s, const char *format,...);
- 功能:除了数据的写入方向是s指向的数组而不是标准输出流之外,其他与printf函数相同。虽然在已入的输出字符串的末尾会添加空字符,但统计返回字符数时不会将该空字符计算在内。在空间重叠的对象间进行复写操作时,作未定义处理
- 返回值:返回已写入数组的不包含空字符的字符数
- 代码示例:显示某几个月的日历
toupper()
- 头文件:
#include<ctype.h>
- 格式:
int toupper(int c);
- 功能:把小写英文字母转换成对应的大写英文字母
- 返回值:如果c是小写英文字母,就返回转换成大写英文字母的值,否则直接返回c
tolower()
- 头文件:
#include<ctype.h>
- 格式:
int tolower(int c);
- 功能:把大写英文字母转换成对应的小写英文字母
- 返回值:如果c是大写英文字母,就返回转换成小写英文字母的值,否则直接返回c
getch()
- 头文件:
#include<conio.h>
- 格式:
int getch(void);
- 功能:直接从键盘读取字符而不需要再键入回车,且不显示读取的字符
- 返回值:返回读取的字符的值(ASCII码),错误则返回EOF
- 代码示例:getch的使用示例
getchar()
- 头文件:
#include<stdio.h>
- 格式:
int getchar(void);
- 功能:用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。
- 返回值:返回读取的字符的值(ASCII码),错误则返回EOF
关于 gets/getch/getchar 这几种简单函数区别见 get类函数区别.cpp
kbhit()
- 头文件:
#include<conio.h>
- 格式:
int kbhit(void);
- 功能:检查当前是否有键盘输入
- 返回值:若有则返回一个非0值,否则返回0
- 代码示例:kbhit.c
putch()
- 头文件:
#include<conio.h>
- 格式:
int putch(int c);
- 功能:在画面上显示字符c(在一些特殊的环境中,如果c是换行符就只换行而不进行返回操作)
- 备注:其中c可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以为char定义好的一个字符型变量
- 返回值:显示成功后返回字符c,错误则返回EOF
putchar()
- 头文件:
#include<stdio.h>
- 格式:
int putchar(int c);
- 功能:向 stdout 输出一个字符,stdout 是输出流,可以到屏幕(默认),也可以到打印机等。
- 备注:其中c可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以是事先用char定义好的一个字符型变量
- 返回值:当输出成功返回字符c,错误则返回EOF
关于 puts/putch/putchar 这几种简单函数区别见 put类函数区别.cpp
运行错误及解决办法:
一些在VS 2017下运行出错的情况,及解决方法。
Error C4996
:
- 错误原因:VS认为该C函数不安全
- 解决办法:在VS
项目-xxx属性-配置属性-C/C++-预处理器-预处理器定义
内添加_CRT_SECURE_NO_WARNINGS
或 在文件顶部加入#define _CRT_SECURE_NO_WARNINGS
- 备注:设置非永久性,遇到就得设置
Error C2440
:
- 错误原因:VS下无法从
void *
转换为int *
- 解决办法:强制转换为同一类型,例如:
(int *)(void *)
- 备注:有强制转换为显式类型转换(C++),无强制转换为隐式类型转换(C/C++),显示类型转换较为妥当。
明解C语言的更多相关文章
- 《明解c语言》已看完,练习代码此奉上
2016年9月20日至2016年11月12日,从学校图书馆借来的<明解c语言>看完了. 大三第一个学期,前8周,有c语言程序设计的课.课本是学校里的老师编写出版的,为了压缩空间,减少页面, ...
- C语言学习书籍推荐《明解C语言》下载
柴田望洋 (作者), 管杰 (译者), 罗勇 (译者) <明解C语言>是日本的C语言经典教材,自出版以来不断重印.修订,被誉为“C语言圣经”.作者在日本IT界家喻户晓,出版过一系列极富影响 ...
- 哨兵查找法(明解c语言) + 函数式宏
//哨兵法,就是将待查找的元素加入待查找的数组的后面,这样可以提高性能(在数据量很庞大的时候体现出来) #include <stdio.h> #define FAILURE -1 //使用 ...
- 明解C语言 入门篇 第五章答案
练习5-1 /* 依次把1.2.3.4.5 赋值给数组的每个元素并显示(使用for语句) */ #include <stdio.h> int main(void) { int i; ]; ...
- 明解C语言,练习13-3,从文件中读入个人信息,按身高排序后显示
#include <stdio.h> #define NUMBER 6 #define F_PATH "D:\\C_C++\\ec13-3\\hw.dat" typed ...
- 明解C语言 入门篇 第四章答案
练习4-1 #include <stdio.h> int main(void) { int no; int x; do{ printf("请输入一个整数:"); sca ...
- 明解C语言 入门篇 第三章答案
练习3-1 #include <stdio.h> int main() { int x; int y; puts("请输入两个整数."); printf("整 ...
- 明解C语言 入门篇 第二章答案
练习2-1 #include <stdio.h> int main() { int x; int y; int percent; puts("请输入两个整数"); pr ...
- 明解C语言 入门篇 第一章答案
练习1-1 #include <stdio.h> int main() { int a; a = 15; int b; b = 37; int c; c = a - b; printf(& ...
随机推荐
- Python之操作Excel、异常处理、网络编程
知识补充: 1.falsk模块中一些方法总结 import flask from flask import request,jsonify server = flask.Flask(__name__) ...
- vi 命令学习(一)
行内移动] w word 向后移动一个单词 b back ·向前移动一个单词 行首 ^ 行首,第一个不是空白字符的位置 $ 行尾 [行数移动] gg go 文件顶部 G go 文件末尾 数字gg go ...
- centos中安装jdk
1.上传jdk安装文件到根目录 2.解压到相关目录 (1)创建相应目录mkdir -p /usr/local/java (2)解压 tar -zxvf jdk-7u80-linux-x64.tar.g ...
- 66.零停机下reindex
主要知识点: 理解reindex的使用场景和必要性 学会reindex 一.理解reindex的使用场景和必要性 假设:在某一个index中依靠dynamic mapping插入数据, ...
- 【LeetCode Weekly Contest 26 Q3】Friend Circles
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...
- ansible special topics
1.加速模式运行playbook accelerate 对于使用ansible 1.5 及之后版本的用户,加速模式只在以下情况下有用处: (A) 管理红帽企业版 Linux 6 或者更早的那些依然使用 ...
- JS判断浏览器类型和屏幕分辨率来调用不同的CSS样式
代码如下: <!-- if (window.navigator.userAgent.indexOf("MSIE")>=1) { var IE1024="&qu ...
- 浅析gcc、arm-linux-gcc和arm-elf-gcc关系
浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...
- SecureCRT的设置和美化
一 . SecureCRT 7.1 的 安装 http://liufei888.blog.51cto.com/2625545/1306231 1.下载注册机SecureCRT.v.6.7. ...
- 【ACM】nyoj_6_喷水装置(1)_201308150853
喷水装置(一)时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心 ...