C语言概览(基础)

入门知识(hello world级别)

printf()

printf函数永远不会自动换行。
“\n”只代表一个字符。类似于 \n 的转义字符序列为表示无法输入的字符或不可见的字符提供了一种通用的可扩充机制。

变量

  • 变量类型:
    • int 整型(16位)
    • float 浮点型(32位)-至少6位有效数字
    • char 字符-一个字节
    • short 短整型
    • long 长整型
    • double 双精度浮点型
  • 符号常量:
    “幻数”:指200、30这种数字,不能向以后阅读该程序的人提供什么信息,而且程序修改困难。
    “常量”:给幻数赋予有意义的名字
    工具:#define 名字 替换文本
    
  • 字符输入/输出
    无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则有0个或多个字符组成,行末是一个换行符。
    getchar()与putchar()

    + 每次调用时,getchar从文本流中读入下一个输入字符,并将其作为结果值返回。
    即:在执行语句
    
    1
    c = getchar();
    之后,变量 c 将包含输入流中的下一个字符。这种字符通常是通过**键盘**输入的。 + 每次调用 putchar 时将打印出一个字符,例如:
    1
    putchar();
    将把整型变量 c 的内容以**字符**的形式打印出来,通常是显示在屏幕上。 + putchar 与 getchar 可以交替调用,输出的次序与调用次序一致。 + 文件复制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    /* copy input to output; 1st version */
    main()
    {
    int c;
    c = getchar();
    while (c != EOF) {
    putchar(c);
    c = getchar();
    }
    }
    > 字符在键盘、屏幕或者其他任何地方无论以什么形式表现,它在机器内部都是以位模式存储的。 char类型专门用于存储这种字符型数据,当然 int 也可以用于存储字符型数据,因为某种原因,这里使用 int。

字符数组

例子:读入一组文本行,并把最长的文本行打印出来

1
2
3
4
5
while (还有未处理的行)
if (该行比已处理的最长行还要长)
保存该行为最长行
保存该行的长度
打印最长的行

编写 getline 函数:读取输入的下一行,在督导文件末尾时返回一个信号(更好的是能够在读入文本行时返回该行的长度,而在遇到文件结束符时返回 0 )。且只包含换行符的行,其长度为1.
编写 copy 函数:发现某个新读入的行比以前读入的最长行还要长时,就需要把该行保存起来,即 copy 到另一个安全的位置。
程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
/* maximum input line length */
#define MAXLINE 1000
int _getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print the longest input line */
int main() {
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */

max = 0;
while ((len = _getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}

/* getline: read a line into line, return maxline */
int _getline(char line[], int maxline) {
int c, i;
for (i=0; i<maxline-1 && (c=getchar())!=EOF && c!='\n'; ++i)
line[i] = c;
if (c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}