zoukankan      html  css  js  c++  java
  • 字符串

    【转自】http://www.cnblogs.com/mjios/archive/2013/03/15/2961273.html

    本文目录

    • 一、字符串简介
    • 二、字符串的初始化
    • 三、字符串的输出
    • 四、字符串的输入
    • 五、字符串数组

    说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略

    一、字符串简介

    * 在Java中,一个字符串可以用String类型来存储

    String s = "MJ";

    C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串。

    * 字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志''。''是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志''。

    * 字符串"mj"的存储情况如下(假设用字符数组char a[]来存储):

    注意了,尾部有个'',如果没有这个结束标记,说明这个字符数组存储的并不是字符串

    二、字符串的初始化
    复制代码
     1 char a[3] = {'m', 'j', ''};
     2 
     3 char b[3];
     4 b[0] = 'm';
     5 b[1] = 'j';
     6 b[2] = '';
     7 
     8 char c[3] = "mj";
     9 
    10 char d[] = "mj";
    11 
    12 char e[20] = "mj";
    复制代码

    当我们使用类似第8行的初始化方式时,系统会自动在字符串尾部加上一个结束符

    三、字符串的输出

    我们可以使用stdio.h中两个函数来输出字符串,分别是printf和puts函数

    1.printf函数

    * 这个函数我们已经用过很多遍了,用格式符%s表示需要输出一个字符串

    char a[3] = {'m', 'j', ''};
    printf("%s", a);

    输出结果:,最后面那个是不可能输出的,它只是个空字符,只是字符串结束的标记。

    * 说到这里,有人可能会想:这样看来,似乎把最后的去掉也没什么影响吧,输出结果应该还是一样的啊,都是"mj"。

    我们可以试一下,把最后面的去掉,再进行输出:

    char a[3] = {'m', 'j'};
    printf("%s", a);

    输出结果:,跟上面添加了的输出结果是一样的。

    别高兴地太早了,我只能说你这是侥幸一样的,运气好了一点。

    * 我们再来看一个例子

    复制代码
    1 char a[3] = {'m', 'j', ''}; // 添加了结束符
    2 
    3 char b[] = {'i', 's'}; // 假设忘记添加结束符
    4 
    5 printf("字符串a:%s", a); // 输出字符串a
    6 
    7 printf("
    "); // 换行
    8 
    9 printf("字符串b:%s", b); // 输出字符串b
    复制代码

    看清楚了,第3行的字符数组b后面没有添加结束符,因此b不算是个正宗的字符串。

    按照你的猜想,字符串b的输出应该就是"is",但是输出结果为:,可以看出,当我们尝试输出b的时候,把a也输出了。

    要搞清楚为什么,首先要看看a和b的内存地址:

    printf("a的地址:%x", a);
    printf("
    ");
    printf("b的地址:%x", b);

    输出结果:,由这个数据我们可以分析出a和b的内存存储情况如下:

    可以看出来,数组b和a的内存地址是连续的。我们再回到输出b的代码:

    printf("字符串b:%s", b); // 输出字符串b

    %s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到字符为止,因为是字符串的结束标记。

    所以,如果想要创建一个字符串,记得加上结束符,不然后果很严重,会访问到一些垃圾数据。

    2.puts函数

    1 char a[] = "mj";
    2 puts(a);
    3 
    4 puts("lmj");

    看第2行代码,puts函数会从a的首地址开始输出字符,一直到字符为止。

    输出结果:,可以看出puts函数输出一个字符串后会自动换行。

    * puts函数一次只能输出一个字符串,printf函数则可以同时输出多个字符串

    printf("%s - %s", "mj", "lmj");
     四、字符串的输入

    stdio.h中有2个函数可以用来接收用户输入的字符串,分别是scanf和gets

    1.scanf函数

    char a[10];
    scanf("%s", a);

    scanf函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记

    注意,不要写成scanf("%s", &a),因为a已经代表了数组的地址,没必要再加上&这个地址运算符。

    2.gets函数

    char a[10];
    gets(a);

    gets跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记。

    * gets一次只能读取一个字符串,scanf则可以同时读取多个字符串

    * gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab

    五、字符串数组

    1.字符串数组简介

    * 一维字符数组中存放一个字符串,比如一个名字char name[20] = "mj"

    * 如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)

    * 如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]

    2.字符串数组的初始化

    char names[2][10] = { {'J','a','y',''}, {'J','i','m',''} };
    
    char names2[2][10] = { {"Jay"}, {"Jim"} };
    
    char names3[2][10] = { "Jay", "Jim" };

    可以把字符串数组看作是一维数组,它的元素是字符串。字符串数组names由字符串"Jay"和字符串"Jim"构成。

  • 相关阅读:
    jquery easy ui 学习 (8)basic treegrid
    jquery easy ui 学习 (7) TreeGrid Actions
    jquery easy ui 学习 (6) basic validatebox
    jquery easy ui 学习 (5) windowlayout
    jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性
    提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
    visual studio 添加虚线的快捷键
    VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案
    visual studio 编译时 出现 Files 的值 乱码
    微信 连接被意外关闭
  • 原文地址:https://www.cnblogs.com/zqh005/p/4196412.html
Copyright © 2011-2022 走看看