zoukankan      html  css  js  c++  java
  • C语言学习字符串

    一、C语言一般是如何定义字符串的

    char word[]={‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,''};在结尾加一个0,才能正常定义这个字符串,而且在计算长度的时候需要将这个0也加上。


     

    一般来说,C语言的字符串定义有以下注意点;

    • 以0(整数0)结尾的⼀一串字符

    • 0或’’是⼀一样的,但是和’0’不同

    • 0标志字符串的结束,但它不是字符串的⼀一部分

    • 计算字符串⻓长度的时候不包含这个0

    • 字符串以数组的形式存在,以数组或指针的形式访问

    • 更多的是以指针的形式

    • string.h (标准库)里有很多处理字符串的函数

    二、example

    • char *str = “Hello”;有一个叫str的指针,它指向了一个字符数组,里面的内容是Hello

    • char word[] = “Hello”;当前这里有一个字符数组,里面的内容是Hello

    • char line[10] = “Hello”;有一个字符数组叫line,定义了它10个字节那么大的长度,里面放了Hello,一共有5个字符,需要占6个字节的空间(要算上结尾的0)

    三、字符串常量

    • “Hello”

    • ″Hello″ 会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0

    • 两个相邻的字符串常量会被自动连接起来


     

    这里在第一个printf的时候,两个字符串用双引号括起来,中间没有其他符号,C语言会自动帮我们将他们连接起来

    • 行末的表示下⼀一行还是这个字符串常量

    • C语言的字符串是以字符数组的形态存在的

    • 不能用运算符对字符串做运算

    • 通过数组的方式可以遍历字符串

    • 唯一特殊的地方是字符串字⾯面量可以用来初始化字符数组

    • 以及标准库提供了一系列字符串函数

    @注意点

    char* s = "Hello, world!";

    • s 是一个指针,初始化为指向一个字符串常量

    • 由于这个常量所在的地⽅方,所以实际上s是 const char* s ,但是由于历史的原因,编译器接受不带const的写法

    #include <stdio.h>
    int main(void)
    {
    int i=0; //本地变量
    char *s = "Hello world";
    //s[0] = 'B';
    char *s2 = "Hello world";
    printf("&i=%p
    ",&i);
    printf("s = %p
    ",s);
    printf("s2 = %p
    ",s2);
    printf("Here!s[0]=%c
    ",s[0]);
    return 0;
    }


     

    • 但是试图对s所指的字符串做写⼊入会导致严重的后果

    • 如果需要修改字符串,应该用数组:

    char s[] = "Hello, world!";

    四、指针还是数组?

    • char *str = “Hello”;

    • char word[] = “Hello”;

    • 数组:这个字符串在这里

    • 作为本地变量空间自动被回收

    • 指针:这个字符串不知道在哪里

    • 处理参数

    • 动态分配空间


     


    五、char*是字符串?

    • 字符串可以表达为char*的形式

    • char*不一定是字符串

    • 本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)

    • 只有它所指的字符数组有结尾的0,才能说它所指的是字符串


    六、字符串赋值

    • char *t = “title”;

    • char *s;

    • s = t;

    • 并没有产⽣生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的

    七、字符串输入输出

    • char string[8];

    • scanf(“%s”, string);

    • printf(“%s”, string);

    • scanf读入一个单词(到空格、tab或回车为止)

    • scanf是不安全的,因为不知道要读入的内容的长度

    安全的输入

    在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一

    #include <stdio.h>
    int main()
    {
    char word[8];
    char word2[8];
    scanf("%7s",word);  //%s之前限制长度
    scanf("%s",word2);//假如超过限定长度,会报abort trap:6,scanf数组越界
    printf("%s##%s##
    ",word,word2);
    return 0;
    }

     

    八、常见错误

    • char *string;定义一个指针变量,

    • scanf(“%s”, string);

    • 以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了

    • 由于没有对string初始化为0,所以不一定每次运行都出错

    九、空字符串

    • char buffer[100]=””;

    • 这是一个空的字符串,buffer[0] == ‘’

    • char buffer[] = “”;

    • 这个数组的长度只有1!只有buffer[0]

    十、字符串数组

    • char **a

    • a是一个指针,指向另一个指针,那个指针指向一个字符(串)

    • char a[][]

    • a是一个二维数组,第二个维度的大小不知道,不能编译通过

    • char a[][10]

    • a是一个二维数组,a[x]是一个char[10],长度为10,a[0],10个字符

    • char *a[]

    • a是一个一维数组,a[x]是一个char*,a[0]是一个指针,指向外面其他的内容

    #include <stdio.h>
    int main(void)
    {
         char * str[] = {'0',"January","February",
         "March","April","May",
         "June","July","August","September",
         "October","November","December",""};  //指针数组,每个指针指向一个字符串常量 
         printf("请输入月份: ");
         int month;
         scanf("%d",&month);
         printf("%s",str[month]);
         return 0;
         
     } 

    十一、程序参数

    • int main(int argc, char const *argv[])

    • argv[0]是命令本身

    • 当使用Unix的符号链接时,反映符号链接的名字

  • 相关阅读:
    Thinking in Java 第十六章学习笔记----数组
    Thinking in Java第十五章学习笔记----泛型
    Thinking in Java第十四章学习笔记----类型信息
    Thinking in Java第十三章学习笔记----字符串
    Kaggle竞赛--Titanic:Machine Learning from Disaster
    sklearn 常用算法参数设置与选择
    Pandas 入门知识
    机器学习常用数据集
    感知机PLA
    决策树CART--原理与实现
  • 原文地址:https://www.cnblogs.com/guoweilf/p/11474992.html
Copyright © 2011-2022 走看看