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

  • 相关阅读:
    线程执行android的looper,handler消息小结
    类型对象phonegap入门10 Contacts
    域名查询普及一下域名知识
    类数据[Android Training视频系列] 6.3 Saving Data in SQL Databases(保存数据到SQLite)
    概率初始化hdu 2955 (01背包变形)
    类最大hdu 1792 A New Change Problem
    标签定义jQuery 入门教程(41): jQuery UI Tab 示例(一)
    nullnullOptimizing Navigation for TV 优化电视导航
    nullnullHandling Features Not Supported on TV 在电视上处理不支持的功能
    nullnullLoading Large Bitmaps Efficiently 有效的处理较大的位图
  • 原文地址:https://www.cnblogs.com/0zcl/p/6041785.html
Copyright © 2020-2023  润新知