回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 30. 字符串字面量
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
13. 标识符命名规则
30. 字符串字面量推荐
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

30. 字符串字面量


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-04-14 16:47 被读5070次 【字体:

Antigloss 最后修改于 2006-12-28

    字符串字面量(string literal)是指双引号引住的一系列字符,双引号中可以没有字符,可以只有一个字符,也可以有很多个字符。例如:

        ""
        "A"
        "I am a man."

    C 没有为字符串字面量提供特别的数据类型,而是把它当作字符型数组来处理。字符串字面量的字符都是相邻的,所以使用字符数组来处理它是自然而然的。尽管不用特别写明,但每个字符串字面量最后都隐含着一个空字符(\0)。例如:

        "First"

其在内存中的存储情况如下图所示:

           

注意,上图最后有一个字符 \0,这个就是空字符null character)。字符 \0 不是数字 0,而是一个不可打印字符,它的值是 0。每个字符串字面量都隐含着这个字符,因此,当您看到一个字符串字面量只有 5 个字符时(例如 "First"),其实它有 6 个字符。

    上面提到的字符串字面量同时也是字符串。所谓字符串(string),是指以第一个空字符作为结束标志的一系列连续的字符(包括该空字符)。显然,上面提到的字符串字面量都是以空字符结尾的,故而它们亦都是字符串。然而,字符串字面量并非一定是字符串。例如:

        "First\0Second"

这是字符串字面量,但却不是字符串,因为该字符串字面量中间包含了一个空字符。该字符串字面量包含两个字符串:

        First\0

以及

        Second\0

    计算字符串的长度时,不用把 \0 也算上。例如:

        "First"

的长度是 5。也就是说,如果一个字符串长度为 5(包含六个字符),那么必须使用元素个数大于或者等于 6 的字符数组来存储这个字符串。

    以下程序演示了字符串的简单应用:

        /*--------------------------------------------------------------
         | 作者: Antigloss @ http://stdcpp.cn @ 蚂蚁的 C/C++ 标准编程
         | 
         | 功能: 演示字符串字面量及字符串的简单应用
          -------------------------------------------------------------*/

        #include <stdio.h>

        int main(void)
        {
            char welcome[] = "Welcome!";  /* 使用字符串字面量初始化字符数组 */
            char name[50];

            printf("Please enter your name: ");
            scanf("%s", name);

            printf("%s %s.\n", welcome, name);

            return 0;
        }

因为 "Welcome!" 是字符串字面量,所以其实它隐含着一个空字符 \0。尽管我们从代码的层面上看不到 \0 的存在,但它却确实存在着。所以,使用 "Welcome!" 初始化 welcome 数组后,该数祖的元素个数为 9。如下图:

       

%s 告诉 scanf 函数接收字符串。scanf 接收用户输入后,会自动在字符数组中添上 \0,所以我们无需手动输入 \0。注意,scanf 中的 name 前面没有取址运算符 &,因为 name 是数组。数组作为参数传递给函数时,会自动退化为指针

    如果输入 Antigloss Huang,则输出为:Welcome! Antigloss.。例如:

        Please enter your name: Antigloss Huang
        Welcome! Antigloss.

您可能会感到奇怪,为什么后面的部分没有输出?这是因为格式限定符 %s 规定 scanf 把第一个非空白字符(空格、制表符,或者换行符)开始,直到遇到空白字符为止的字符存储到指定的内存单元。本例是把 Antigloss 存入数组 name 中。如果第一个非空白字符之前有空白字符,则这些空白字符会被忽略。所以,就算输入:

        Please enter your name:                Antigloss Huang

输出仍然会是:

        Welcome! Antigloss.

scanf 会忽略 Antigloss 前面的空白字符,把 Antigloss 读入数组 name 后,遇到空格,所以不再读取后面的字符。因此,输出不是 Welcome! Antigloss Huang.,而仅仅是 Welcome! Antigloss.

    %s 告诉 printf 输出字符串。%s 在第二个 printf 中出现两次是因为我们要输出两个字符串。

    注意,字符串字面量 "A" 和字符常量 'A' 是不同的!首先,'A' 属于基本数据类型(字符型),而 "A" 属于派生数据类型(字符数组);其次,"A" 包含两个字符:'A' 和 '\0'。如下图:

       

参考资料:C Primer 5th Edition
          comp.lang.c FAQ list · Question 1.32
          The C Programming Language 2nd Edition
          C99 标准

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 语言数据类型
38. 布尔类型再探讨
29. 数组基础(下)

上一篇:29. 数组基础(下)
下一篇:31. 预处理指令 #define 和符号常量

共有评论 9 条 网友评分 1分 查看全部评论

游客:江江
评分:0
想问一下,如果要输入一段文字,要求每行最多有200个字符,应该怎么处理? 谢谢
游客:antigloss
评分:5
不太明白你的意思
是指每行达到200字符后就不能输入了?
游客:linda
评分:2
有谁能告诉我,字符串与长整型怎么实现它们两者的加法运算呢?
游客:antigloss
评分:0
先将字符串转化成长整型,可用 sscanf 函数:

    sscanf(str, "%ld", &l_int);

当然首先要确保 str 里面保存的是数字。
游客:linda
评分:5
哦这样啊
谢谢啊哈
不过我们 sscanf 函数还没教呢
而且我现在是用C++编的程序。
游客:antigloss
评分:0
没有人规定 C++ 不准用 sscanf。
游客:手指
评分:0
char cA[4]="abcd";
为什么在cA[4]后面会有强制加上一个\0 ?
数组只有能储存4个字符
游客:antigloss
评分:0
你这里不会,因为这个是一个编译时错误!如果你能通过编译,只能说编译器不符合标准。正确的用法应该是

char cA[5]="abcd";

或者

char cA[]="abcd";

无论如何,"abcd"本身是保存于一个长度为五的字符数组中的,以 \0 作为结束标志。

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss