• 数组,字符串


    字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。请看下面的例子:

    1. char str[7];
    2. str = "abc123"; //错误
    3. //正确
    4. str[0] = 'a'; str[1] = 'b'; str[2] = 'c';

       str[3] = '1'; str[4] = '2'; str[5] = '3';

    在C语言中,字符串总是以''作为结尾,所以''也被称为字符串结束标志,或者字符串结束符。

    ''是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。

    C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到''就认为到达了字符串的末尾,就结束处理。''至关重要,没有''就意味着永远也到达不了字符串的结尾。

    " "包围的字符串会自动在末尾添加''。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'',这个过程是在后台默默地进行的,所以我们感受不到。

    下图演示了"C program"在内存中的存储情形:


    需要注意的是,逐个字符地给数组赋值并不会自动添加'',例如:

    1. char str[] = {'a', 'b', 'c'};

    数组 str 的长度为 3,而不是 4,因为最后没有''

    当用字符数组存储字符串时,要特别注意'',要为''留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:

    1. char str[7] = "abc123";

    "abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的''。如果将 str 的长度定义为 6,它就无法容纳''了。

    当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,这就为以后的错误埋下了伏笔

    scanf() 的用法还可以更加复杂和灵活,它不但可以完全替代 gets() 读取一整行字符串,而且比 gets() 的功能更加强大。比如,以下功能都是 gets() 不具备的:

    • scanf() 可以控制读取字符的数目;
    • scanf() 可以只读取指定的字符;
    • scanf() 可以不读取某些字符;
    • scanf() 可以把读取到的字符丢弃。
    天涯犹在,不诉薄凉。
  • 相关阅读:
    再谈:我对测试行业发展和自我价值诉求的思考
    如何写出让业务满意的性能测试报告
    面试突击17:HashMap除了死循环还有什么问题?
    Spring Boot Admin,贼好使!
    为什么HashMap会产生死循环?
    更快的Maven构建工具mvnd和Gradle哪个更快?
    交互软件Flinto Principle
    如何避免 加和浮点数的问题
    Oracle Linux 8.5 For windows
    三门问题
  • 原文地址:https://www.cnblogs.com/Knight02/p/14145975.html
Copyright © 2020-2023  润新知