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

    一、字符串简介

    * 在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函数

    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 1 char a[] = "mj";
    2 2 puts(a);
    3 3 
    4 4 puts("lmj");

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

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

    * puts函数一次只能输出一个字符串  

     四、字符串的输入

    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"构成。

  • 相关阅读:
    LeetCode Power of Three
    LeetCode Nim Game
    LeetCode,ugly number
    LeetCode Binary Tree Paths
    LeetCode Word Pattern
    LeetCode Bulls and Cows
    LeeCode Odd Even Linked List
    LeetCode twoSum
    549. Binary Tree Longest Consecutive Sequence II
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/0zcl/p/6041785.html
Copyright © 2011-2022 走看看