算法竞赛与入门经典 第 3 章笔记

提示 3-4 比较大的数组应尽量声明在 main 函数外,否则程序可能无法运行。

数组不能够进行赋值操作,如果声明的是 “int a[maxn], b[maxn]”,是不能赋值 b = a 的。如果要从数组 a 复制 k 个元素到数组 b,可以这样做:memcpy(b, a, sizeof(int) * k)。如果数组 a 和 b 都是浮点型的,复制时哟啊写成 “memcpy(b, a, sizeof(double) * k)”。另外,使用 memcpy 函数要包含头文件 string.h。如果需要把数组 a 全部复制到数组 b 中,那么,可以更简单一点:memcpyp(b, a, sizeof(a))。

C 语言中的字符型用关键字 char 表示,它实际存储的是字符的 ASCII 码。字符常量可以用单引号法表示。在语法上可以把字符当作 int 型使用。

scanf("%s", s),它会读入一个不含空格、TAB 和回车符的字符串,存入字符数组 s。注意,不是 "scanf("%s", &s)",s 前面没有 "&" 符号。在 "scanf("%s", s)" 中,不要在 s 前面加上 "&" 符号。如果是字符串数组 char s[maxn][maxl],可以用 "scanf("%d", s[i])" 读取第 i 个字符串。注意,"scanf("%s", s)" 遇到空白字符会停下来。

printf("%5d", n) 中,%5d 表示按照 5 位数打印,不足 5 位数在前面补空格。

strchr 的作用是在一个字符串中查找单个字符。strchr(s, buf[i]) 的作用是返回字符 buf[i] 在 s 中第一次出现的我i之

printf 输出到屏幕,fprintf 输出到文件,而 sprintf 输出到字符串。多数情况下,屏幕总是可以输出的,文件一般也能够写(除非磁盘满或者硬件损坏),但字符串就不一定了:应该保证写入的字符串有足够的空间。可以用 sprintf 把信息输出到字符串,用法和 printf、fprintf 类似。但应当保证字符串足够大,可以容纳输出信息。

函数 strlen(s) 的作用是获取字符串 s 的实际长度。什么叫实际长度呢?字符数组 s 的大小是 20,但并不是所有空间都用上了。如果输入是 “2357”,那么实际上 s 只保存了 5 个字符(不要忘记了还有一个结束标记 “\0”),后面 15 个字符是不确定的。strlen(s) 返回的是结束标记之前的字符个数。因此这个字符串的各个字符依次是 s[0], s[1], ..., s[strlen[s] - 1],而 s[strlen(s)] 正是结束标记 “\0”。

Q:下面这行代码执行时,系统是否也会自动在字符串末尾加上结束标记 “\0”?
A:是。
参见下面的实验验证代码:

#include<stdio.h>
#include <string.h>

int main()
{
    char a = 0;
    int b = 0;
    char c = 1;
    char buf[10];
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", buf[i]);
    }
    printf("\n");
    // printf("%d", a);
    // printf("\n");
    sprintf(buf, "%d%d%d%d%d", 1, 2, 3, 4, 5);
    printf("%s", buf);
    printf("\n");
    for (int i = 0; i < strlen(buf); i++)
    {
        printf("%d ", buf[i]);
    }
    printf("\n");
    printf("%d ", buf[5]);
    printf("%d ", buf[6]);
    printf("%d", buf[7]);

    return 0;
}

其输出是:
0 0 0 25 21 64 0 0 0 0
12345
49 50 51 52 53
0 0 0
显然原来的 64 被系统自动改成了 0,也就是 "\0",也就是 NUL(空字符 Null)。

Q:下面的代码中,输出 int 类型整数到字符串中,是否是按照原样 “打印” 到字符串的,比如 555,打印到字符串数组中就是三个字符 5?
A:是。
参见下面的测试代码:

#include<stdio.h>
#include <string.h>

int main()
{
    char a = 0;
    int b = 0;
    char c = 1;
    char buf[10];
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", buf[i]);
    }
    printf("\n");
    // printf("%d", a);
    // printf("\n");
    sprintf(buf, "%d%d", 1, 555);
    printf("%s", buf);
    printf("\n");
    for (int i = 0; i < strlen(buf); i++)
    {
        printf("%d ", buf[i]);
    }
    printf("\n");
    printf("%d ", buf[5]);
    printf("%d ", buf[6]);
    printf("%d", buf[7]);

    return 0;
}

输出结果为:
0 0 0 25 21 64 0 0 0 0
1555
49 53 53 53
64 0 0

通常情况下,int 是 32 位的。

善用常量数组往往能简化代码。定义常量数组时无需指明大小,编译器会计算。

posted @ 2020-12-25 13:08  模糊计算士  阅读(84)  评论(0编辑  收藏  举报