zoukankan      html  css  js  c++  java
  • 字符串的坑点和一些读入输出操作

    坑点: 1:头文件一定别忘了 2:字符数组和字符串区别很大, 有以下几个区别和相同之处: (1):他们默认输入都是从0开始。 (2):如果用字符串常量来初始化字符数组,那数组的实际长度会比一个一个输入多一个,用来存储‘’结束符。 比如如果定义一个字符数组 char c[]={"hh,233"}.那这个字符串的长度就是6. 而如果这样定义 char c[]="hh,233"那就是7,因为这是一个字符常量要加一位结束符。 多说一句,C++数组即使没有任何东西,所占的字节数却还是有的。 (3):最重要的一点,字符串不能用scanf读入,但是字符数组可以用scanf进行读入一整个字符数组。 比如以下这个例子: ``` char s1[100010]; string s2; scanf("%s",s1);//不能读入s2,且s1前不能加取地址符。为什么呢,因为数组有一个特点:他的数组名有两个功能,它既是数组名又是字符数组的第一位的地址。所以前面可以不加取地址符。 ```

    C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。



    <1> 定义: char c[10]

    字符型与整型互相通用,因此 int c[10] 也可以定义字符数组。但由于两种类型分配字节不同, 用整型来定义会浪费空间, 另外这样定义实际意义也不大, 只是为了说明其合法性。

    <2> 初始化: 

        最简单的方法即逐个赋值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10个字符分别赋绐c[0]到c[9]10个元素。

        如果初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'')。
        如char c[12]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 则c[10]、c[11]值都为'' 。



        C语言中,将字符串作为字符数组来处理。一般我们用字符数组来存放字符串时,都要先确定一个足够大的数组,而实际并用不了那么多,而我们只关心其有效位,为测定字符串实际长度,C规定了一个"字符串结束标志",以字符 '' 代表。如果有一个字符串,其中第10个字符为'',则此字符串的有效字符为9个。也就是说,在遇到字符''时,表示字符串结束,由它前面的字符组成字符串。
        系统对字符串常量也自动加一个''作为结束符。

        对于语句: pirntf("How do you do? "); 实际上该字符串在内存中存放时,系统自动在最后一个字符''的后面加了一个''作为字符串结束标志,在执行printf函数时,每输出一个字符检查一次,看下一个字符是否''。遇''就停止输出。

        可以用字符串常量来初始化字符数组。如:

        char c[]={"I am happy"};

        也可直接写成:

        char c[]="I am happy"; 注意此时数组的长度不是10,而是11,因为系统自动加上了''结束符。



        字符数组不要求最后一个字符为'',而为了使处理字符数组和字符串的方法一致,便于测定字符串的实际长度,能及方便在程序中处理, 在字符数组末尾也常加上一个''。



    <3> 字符数组的输入输出 

        (1) 逐个字符输入输出。用格式符"%c"输入或输出一个字符。

        (2) 将整个字符串一次输入或输出。用"%S"格式符,意思是输出字符串(String)。例如:

      char c[]={"china"};
      printf("%S", c);

    如果一个字符数组中包含一个以上'',则遇第一个''时输出就结束。

        (3) 若输入字符串长度超过字符数组所定义的长度时,将造成数组下标越界,但系统对此并不报错。

        (4) 用%S格式输入字符时,遇空格、Tab键和回车将自动结束输入。



    用scanf函数输入时, 遇到空格则认为一个字符串结束。试验如下:

    #include <stdio.h>
    int main()
    {
        char str1[5], str2[5], str3[5];
        scanf("%s %s %s", str1, str2, str3);
        printf("%s %s %s ", str1, str2, str3);
        return 0;
    }

    运行结果:
    ================================
    how are you↙
    how are you
    ================================

    #include <stdio.h>
    int main()
    {
        char str[13];
        scanf("%s", str);
        printf("%s ", str);
        return 0;
    }

    运行结果:
    ================================
    how are you?↙
    how
    ================================

    由第二个程序可知,实际并未将这12个字符加上''送到数组str中,而是将空格前的字符"how"送到str中,将其视为字符串处理,在其后加上'' 。

    总结一下,其最重要的坑点就是各种输入的方法和坏处,还有如果直接读入了字符串枚举要从第0位开始,反之就不。

  • 相关阅读:
    设计模式之禅之设计模式-责任链模式
    设计模式之禅之设计模式-命令模式
    设计模式之禅之设计模式-中介者模式
    设计模式之禅之设计模式-原型模式
    设计模式之禅之设计模式-建造者模式
    设计模式之禅之设计模式-模板方法模式
    <Liunx常用命令一>之TOP
    在LIUNX服务器上找出web项目中占用cpu资源最多的线程的排查方法
    linux下mysql的root密码忘记解决方法
    JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/9379586.html
Copyright © 2011-2022 走看看