字符串

作者: iMikasa_ | 来源:发表于2021-11-15 19:13 被阅读0次

字符串是一种特殊的字符数组,字符串是以空字符(\0)结尾的char类型数组

#include <stdio.h>

int main(int argc, char const *argv[])
{
    //字符数组
    char str1[12] = {'H','e','l','l','o',' ','W','o','r','l','d','\n'};
    printf("%s\n",str1);
    str1[3] = '\0';
    printf("%s\n",str1);
    //'\0'字符的ASCII码是0,系统在检测到该字符的时候就认为字符串已经结束了
    return 0;
}

结果如下


image.png

字符串的声明

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char str1[13] = {'H','e','l','l','o',' ','W','o','r','l','d','\n','\0'};
    char str2[13] = "Hello World\n";
    char str3[]  = "Hello World\n";
    printf("%s%s%s",str1,str2,str3);
    return 0;
}

最常见的是第三种的声明方式,简单又方便

指针形式的字符串声明

char *str4 = "Hello World\n";

数组形式声明字符串和指针形式声明字符串不同

以数组的形式声明字符串,字符串(常量)存储在静态存储区中,程序开始运行时,才会为数组分配内存,此时才将字符串拷贝到数组中。现在字符串就有两个副本。一个是在静态内存中的字符串常量,另一个是存储在数组中的字符串

以指针形式声明的字符串,这个就比较容易理解,只是把字符串常量的地址赋值给我的指针。

如下图


image.png

还有一个区别是,数组形式声明的数组名是常量,而指针形式声明的指针名是变量

由于以上特性,防止通过指针修改字符串常量中的字符,还是以const修饰,更为保险,也更规范

const char * str = "Hello";

如果打算修改字符串,就不要用指针指向字符串常量。

字符串的输入与输出

我们都知道有scanf输入,但是对于读取我们输入的字符串来说,使用体感并不好,下面介绍字符串输入输出的一些方式

  • gets() 与 puts()
    我们之前使用scanf()的时候,如果我们的输入有空格的话,它仅仅读取从开始到空格的地方,而我们的gets(),它会读取整行输入,直到遇见换行符,然后丢弃换行符,存储其他的字符,并在这些字符末尾添加一个空字符串,使其成为标准的字符串;
    而puts()比较简单,puts()在显示字符串时会自动在其末尾添加一个换行符,所以打印的每个字符串都会独占一行;
    他们的参数都只有一个,只需把字符串的地址作为参数传递给它们即可,如下小例子
    //LEN是我定义的一个常量整数值
    puts("test gets() ....");
    char str[LEN];
    gets(str);
    puts(str);

思考一下,如果我输入的字符串长度超过我所定义的字符串长度,会怎样呢?这样不安全,他也会完整的读取你输入的字符串,但是他会占用其他地方的内存,造成安全问题,这就是缓冲区溢出。虽然这个方法非常简单,但是也属于淘汰的东西了(一些编译器为了兼容,仍然可以使用)

  • fgets() 与 fputs()
    fgets()是通过第二个参数限制读取的字符串来解决溢出的问题。该函数专门设计用来处理文件输入的。
    第一个参数也是字符串的地址;
    第二个参数是知名读入字符串的最大数量,如果是n,将会读取到n-1或者遇见的第一个换行符为止;
    第三个参数是知名要读入的文件,如果读入从键盘收入的数据,则以stdin作为参数;
    如下程序
    char str[SLEN];
    fgets(str,5,stdin);
    fputs(str,stdout);

字符串函数

c库提供了多个处理字符串的函数,方便操作
我打算之后在一个新篇幅内填坑.........

相关文章

  • Javascript知识点整合

    字符串 单行字符串: ‘字符串’或“字符串” 多行字符串: `多行字符串` 字符串操作: 字符串连接‘+’号 长度...

  • C++基础字符串

    字符串的构造 字符串特性描述 字符操作 字符串赋值 字符串连接 字符串比较 字符串查找 字符串替换 字符串删除 字...

  • iOS中的NSString与NSMutableString

    字符串的创建 字符串读写 字符串的比较 字符串的搜索 字符串截取 字符串替换 字符串与路径 字符串转换 NSMut...

  • iOS NSString用法总结

    字符串属性 字符串截取 字符串比较 字符串搜索 字符串拼接 字符串基本类型转换 字符串分行,分段 字符串列举(按条...

  • php 字符串常见方法汇总

    字符串拼接 字符串检索 字符串截取 字符串替换 字符串大小写转化 字符串转数组 字符串格式化

  • iOS 字符串截取、iOS 字符串替换、iOS 字符串分隔、iO

    iOS之字符串截取、iOS 字符串替换、iOS字符串分隔、iOS之字符串匹配、截取字符串、匹配字符串、分隔字符串 ...

  • PHP中字符串函数库常用函数解析 -- PHP 学习 (十一)

    常用字符串函数分类: 字符串长度, 字符串查找, 字符串大小写转换, 字符串截取, 字符串 ASCII, 字符串加...

  • Kotlin语言(二):字符串类型

    1、字符串定义 2、字符串删除空格 3、字符串比较 4、字符串切割 5、字符串截取 6、字符串替换 7、字符串模板

  • 字符串扩展

    求字符串大小 字符串解码、转换 字符串截取 字符串汉字处理 字符串 Mac地址 字符串进制转换

  • 2020-09-30字符串

    day8-字符串 字符串的操作 in 和 not in字符串1 in 字符串2 - 判断字符串1是否是字符串...

网友评论

      本文标题:字符串

      本文链接:https://www.haomeiwen.com/subject/aybqtrtx.html