第一次读这本书的时候是大三初,现在打算重读一遍!。
第一章 导言
1. 学习一门新程序设计语言的唯一途径就是用它来写程序。
2. 每个程序都从main函数的起点开始执行。
3. 在C语言中,所有变量必须先声明后使用。
4. C语言中的基本数据类型的大小取决于具体机器。
5. 在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。
6. 标准库的输入/输出模型是按照字符流的方式处理,每行字符都有0个或者多个字符组成,末尾是换行符。
7. 函数为计算的封装提供了一种简便的方法,函数都是通过传值调用。
#include <stdio.h>
// 文件复制
int main() {
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
/*
* 编写一个将输入复制到输出的程序,
* 并将其中连续的多个空格用一个空格代替.
*/
#include <stdio.h>
int main() {
int c;
int flag = 0; // 当前字符是否为空格
while ((c = getchar()) != EOF) {
if ((c == ' ' && flag == 0) || (c != ' ')) {
putchar(c);
flag = !flag;
}
}
return 0;
}
#include <stdio.h>
#define IN 1 // 单词内
#define OUT 0 // 单词外
// 统计行数, 单词数和字符数
int main() {
int c;
int numLines = 0; // 行数
int numWords = 0; // 单词数
int numCharacters = 0; // 字符数
int state = OUT;
while ((c = getchar()) != EOF) {
++numCharacters;
if (c == '
') {
++numLines;
}
if (c == ' ' || c == ' ' || c == '
') {
state = OUT;
} else if (state == OUT) {
state = IN;
++numWords;
}
}
printf("%d %d %d
", numLines, numWords, numCharacters);
return 0;
}
#include <stdio.h>
#define MAXLINE 1000
/*
* 读入一行字符
*/
int getline_s(char *s, int lim) {
int c, i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '
'; ++i) {
s[i] = c;
}
if (c == '
') {
s[i] = c;
++i;
}
s[i] = ' ';
return i;
}
/*
* 拷贝数组
*/
void copy(char *to, char *from) {
int i = 0;
while ((to[i] = from[i]) != ' ') {
++i;
}
}
int main() {
int len;
int max = 0;
char line[MAXLINE];
char longest[MAXLINE];
while ((len = getline_s(line, MAXLINE)) > 0) {
if (len > max) {
max = len;
copy(longest, line);
}
}
if (max > 0) {
printf("%s
", longest);
}
return 0;
}
第二章 类型,运算符与表达式
1. 变量名不要以下划线开头,以避免与标准库的冲突。
2. 数据类型及描述,此外还可以在这些基本数据类型上加上一些限定符,例如short和long等。
| 数据类型 | 描述 |
| char | 字符型,占用一个字节,可以存放本地字符集的一个字符 |
| int | 整型,通常反映所用机器中整数最自然的长度 |
| float | 单精度浮点数 |
| double | 双精度浮点数 |
3. short与int类型至少为16位,而long类型至少为32位,并且short类型不得长于int类型,而int类型不得长于long类型。
4. 有关类型长度定义的符号常量以及其他与机器和编译器有关的属性可在<limits.h>和<float.h>中找到。
5. 常量表达式在编译时求职,不在运行时求值。(#define)
6. 字符串常量就是字符数组。
7. 枚举常量: enum boolean{NO, YES}。
8. 默认情况下,外部变量与静态变量初始化为0,未经初始化的自动变量的值未定义。
9. 在负操作数的情况下,整数除法截取的方向以及驱魔结果的符号取决于具体实现。
10. 标准库<ctype.h>定义了一组与字符集无关的测试和转换函数。
11. 位操作运算符:按位与(&),按位或(|),按位异或(^),左移(<<),右移(>>)。
12. sizeof(对象长度)是运算符,我一直以为是函数。冏
// strlen简化版本
int strlen(const char *str) {
int i = 0;
while (str[i] != ' ') {
++i;
}
return i;
}
// 将字符串转换成整数值
int atoi(char *s) {
int i;
int result = 0;
for (i = 0; s[i] != ' '; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
result = result * 10 + (s[i] - '0');
}
}
return result;
}
unsigned long next = 1;
//返回取值0~32767之间的伪随机数
int rand(void) {
next = next * 110531245 + 12345;// ?
return (unsigned int)(next / 65535) % 32768;
}
// 随机数种子
void srand(unsigned int seed) {
next = seed;
}
1 // 从字符串s中删除字符c 2 void squeeze(char *s, int c) { 3 int i, j; 4 for (i = j = 0; s[i] != '