zoukankan      html  css  js  c++  java
  • 小学生都看得懂的C语言入门(6): 字符串

    1.字符用 char 表示

    #include<stdio.h>
    int main()
    {
        char c;
        char d;
        c=1;
        d='1';
        if (c==d){
            printf("equal
    ");
        }else{
            printf("not equal
    ");
        }
        return 0;
    }

    结果显示两者不相等, 若用%d形式输出,则有

        printf("c=%d
    ",c);// 1
        printf("d=%d
    ",d);//49 

    如何输入'1' 给字符c ?

    #include<stdio.h>
    int main()
    {
        char c;
        scanf("%c",&c);// 输入1 
        printf("c=%d
    ",c);//'1'表示ASCII码 49
        printf("c='%c'
    ",c);//'1' 这里的'' 要自己加上去!!
        return 0;
    }

    输入一个1进去,

    #include<stdio.h>
    int main()
    {
        char c;
        int  i;
        scanf("%d",&i);
        c=i;
        printf("c=%d
    ",c);// 
        printf("c='%c'
    ",c);//
        return 0;
    }

    分别输入1 和 49 得到:

    由此,'1' 的ASCII编码是49

    #include<stdio.h>
    int main()
    {
        char c;
        int  i;
        scanf("%d",&i);
        c=i;
        printf("c=%d
    ",c);// 
        printf("c='%c'
    ",c);//
        if (49=='1'){
            printf("okay");
        }
        return 0;
    }

    输入48 ,得到 ,

    说明 '1'=49, '0'=48;

    #include<stdio.h>
    int main()
    {
        char c;
        scanf("%c",&c);
        printf("c=%d
    ",c);// 1
        printf("c=%c
    ",c);//49 
        return 0;
    }

    得到

    2. 混合输入

    #include<stdio.h>
    int main()
    {
        // 混合输入
        int i;
        char c;
        scanf("%d %c",&i,&c); 
        printf("i=%,c=%d,c='%c'",i,c,c);
        return 0;
    }

    输入 12 1

    得到  i=12,c=49,c='1'

    输入  12 a
    得到  i=12,c=97,c='a'

    字符的计算 如下

    #include<stdio.h>
    int main()
    {
         char c='A';
        c++;
        printf ("'%c'
    ",c);//'B'
        int i='Z'-'A'; 
        printf ("%d
    ",i);//25
        
        return 0;
    }

     

    #include<stdio.h>
    int main()
    {
        printf("123A
    456"); //  往回删一个3,
        return 0;
    }

    12A
    456

    3. 字符串

     char w[]={'g','o','o','d','!'}; // 字符数组
     char w[]={'g','o','o','d','!',''}; //  后面加了0, 表示字符串

    字符串是以0 结尾的字符, 0 与'' 一样, 但是与'0'不同.

     但是计算字符串的长度是不包含这个 0 的;

    字符串以数组的形式存在, 可以用数组或者指针进行访问, 

    string.h 中很多处理字符串的函数;

    #include<stdio.h>
    int main()
    {
        // 定义字符串
        char *str="hello"; // 要用双引号 
        char w[]="hello";
        char line[10]="hello"; // 实际长度是5+1, 结尾还有表示结束的0; 
        printf("please in put a num"" for example 1:"); // 会自动连起来
        printf("please in put a num"
        " for example 1:");// 与上述一样
        return 0;
    }
    #include<stdio.h>
    int main()
    {
        int i=0;
        char *s="hello world";
        char *s2="hello world"; 
        printf("&i=%p
    ",&i); // 打印i 的地址 
        printf("s=%p
    ",s);
        printf("s2=%p
    ",s2);
        return 0;
    }

    得到结果

    &i=000000000062FE3C
    s=0000000000404000
    s2=0000000000404000

    s s2的地址一样, 但是本地变量i 和s 相差很大, s地址很小, i 地址很大, 他们距离很远, 这是为啥??

    #include<stdio.h>
    int main()
    {
        char *s="hello world";
        s[0]='B';// 出错
        printf("here s[0]=%c
    ",s[0]); // 错了 
    
        return 0;
    }

    s 位于程序的代码端, 是只读的 ,不可以写, 因此不能进行修改s[0]='B', 否则程序崩溃!!

    实际上 这个s 的类型是 const char *s, 由于历史原因, 编译器不接受 const  写法;

    如果想要对 字符串进行修改, 就要用数组形式进行定义!!  char s[ ]="hello world!";

    #include<stdio.h>
    int main()
    {
        int i=0;
        char *s="hello world";
    //    s[0]='B';
        char *s2="hello world"; 
        char s3[] ="hello world";
        printf("&i=%p
    ",&i); // 打印i 的地址 
        printf("s=%p
    ",s);
        printf("s2=%p
    ",s2);
        printf("s3=%p
    ",s3);    
    //    printf("here s[0]=%c
    ",s[0]); // 错了 
    
        return 0;
    }

    得到

    &i=000000000062FE3C
    s=0000000000404000
    s2=0000000000404000
    s3=000000000062FE30

    s3 的地址也在一个很大的地方!!, 是本地变量

    4.字符串运算

        char*t="title"; // t指向了字符串
        char*s;
        s=t;  //s也指向了该字符串
        // 并没有产生新的字符串,只是让指针s 指向了 t所指的字符串, 
        // 对s 的操作就是对t做的 
    #include<stdio.h>
    int main()
    {
        char  ss[8];
        scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
        printf("%s#
    ",ss);
        return 0;
    }

    输入hello world
    得到hello#

    没有读到 world, 如何让它读到??

    #include<stdio.h>
    int main()
    {
        char  ss[8];
        char ss1[8];
        scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
        scanf("%s",ss1);
        printf("%s#
    %s#
    ",ss,ss1);
        return 0;
    }

    输入hello world

    得到

    hello#
    world#

    但是没有读到hello 与 world 中间的空格, 这个空格用来区分两个单词, 是个分隔符

    scanf 读到空格,tab 或者回车为止, 并且他是不安全的, 因为不知道要读入的长度, 怎么处理?

    scanf("%7s",ss); // 最多输入7个字符! 数组长度是8 ,算上结尾的0 ,最多7个

    #include<stdio.h>
    int main()
    {
        char  ss[8];
        char ss1[8];
        scanf("%7s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
        scanf("%7s",ss1);
        printf("%s#
    %s#
    ",ss,ss1);
        return 0;
    }

    注意:  第一个超过7个的只读了前7个, 后面断掉了, 但是第二个单词还是取了前面没读完的部分,

    输入fahfjkhdskjfh jadshfjka
    fahfjkh#
    dskjfh#  

    输入hjd jfahkjhfl
    hjd#
    jfahkjh#

    其他:

    char b[10]="";// 空字符串, b[0]=''
    char b[]=""; // 这个数组长度只有1, 

    5. 字符串的函数

     #include<string.h>

    常用函数:

    (1)strlen 计算长度

    (2)strcmp 比较

    #include<stdio.h>
    #include<string.h>
    int main() 
    {
        char  line[]="hello";
        printf("srtlen=%lu
    ",strlen(line));// 5  字符串长度 
        printf("sizeof=%lu
    ",sizeof(line)); //6  占据的空间 
        return 0;
    }
    #include<stdio.h>
    #include<string.h>
    int main() 
    {
        char s1[]="hello";
        char s2[]="hello";
        printf("%d
    ",strcmp(s1,s2));//0 表示两者相等 ,这个有些与逻辑值不同 
        printf("%d
    ",s1==s2);//0 ,地址不相同 
        return 0;
    }

    strcmp(s1,s2) 得到

    0  s1==s2;

    1  s1<s2;

    -1 s1>s2;

    #include<stdio.h>
    #include<string.h>
    int main() 
    {
        char s1[]="hello";
        char s2[]="gello";
        printf("%d
    ",strcmp(s1,s2));//1 
        return 0;
    }

    (3) strcpy 复制 位置对应, 从位置0开始,

    (4)strcat 连接, 位置不对应, 从后面开始接上去!

    两者都存在安全问题, 可能目标地的存储空间不够, 用strncpy, strncat, n 表示最多拷贝多少个进去

    strncpy(s1,s2,n)

    (5)strchr 在字符串中找字符, null 则没有找到

    ----END---- HAVE A GOOD ONE! 以上为本人课余自学工具书/blog的笔记整理, 常有更新, 非100%原创!且读且学习。
  • 相关阅读:
    AOP
    session的一些原理
    HttpContext.Cache和Application的区别
    什么是COM组件
    MS—SQL数据库索引的应用
    会话状态(转)
    LINQ体验(6)——LINQ语句之Join和Order By(转)
    永远不停止学习,才是程序员最大的财富,欢迎加入CMS研究室
    面向对象
    从瀑布型开发到迭代型开发的转变
  • 原文地址:https://www.cnblogs.com/xuying-fall/p/9260788.html
Copyright © 2011-2022 走看看