C语言入门:进阶篇04 字符串

文章详细介绍了C语言中字符串的三种存在形式:字符数组、字符串字面值以及它们之间的赋值操作。讨论了字符串输入的scanf、gets和fgets函数的优缺点,以及输出的printf和puts函数。此外,还阐述了缓冲区的概念,包括输出缓冲区和输入缓冲区的工作原理及常见问题的解决方法。最后,提到了一些常用的字符串处理函数如strlen、strcpy等。
摘要由CSDN通过智能技术生成

字符

        人能看得懂的符号或图案,在内存中以整数形式存储,根据ASCII码表中的对应关系显示出相应的符号或图案

        是一种数据结构,存储类型相同的若干个数据

        对于串型结构的处理是批量性的,会从头开始直到遇到结束标志停止

字符串

        由字符组成的串型结构,结束标志是'\0'



1 字符串存在形式

1.1 字符数组

        char str[10]={'a','s',...}

        缺点:由char组成的数组,时刻要谨记要为\0预留位置,初始化麻烦

        优点:属于栈内存,内容可以修改

1.2 字符串字面值

        "由双引号包含的若干个字符"

        优点:末尾会隐藏'\0',定义方便

        缺点:字符串字面值就是以地址形式存在,是常量,存储在代码段(只读段),不能修改,否则段错误。

  *注意:  ① 相同内容的多份字符串字面值在代码段中只会存在一份

                ② sizeof("xxx")会计算出字符个数+1

1.3 常用方式

        字符串字面值给字符数组赋值

        char 数组名[] = "字符串字面值"

        优点:会自动为'\0'预留位置,内容可以修改

  *注意:当赋值完成后,该字符串在内存中有两份,一份在代码段,一份在栈内存。

2 字符串的输入和输出

2.1 输入

    scanf("%s",地址);

        缺点:不能输入空格即字符串有空格就结束

    char *gets(char *s);

        功能:输入字符串到s中

        返回值:s 链式调用

        优点:能够接收空格

        缺点:有警告,输入长度不受限制,有风险

    char *fgets(char *s,int size,FILE *stream);

        功能:可以输入长度最多为size-1个的字符串,超出部分不接收,不足时最后的回车也会一起接收。

        优点:能够接收空格,自动为'\0'预留位置

        缺点:使用比较麻烦

2.2 输出

    printf("%s",地址);

    int puts(const char *s);

        功能:能够输出一个字符串,并且会自动在末尾打印'\n'换行

        返回值:成功输出的字符个数

3 缓冲区 

        缓冲区机制可以提高数据的读写速度,还可以让低速的设备高速的CPU之间系统工作

3.1输出缓冲区

        程序要显示的数据并不会立即显示到屏幕上,而是先存储到输出缓冲区中,当满足一定条件时才会从输出缓冲区显示到屏幕上。

所谓的一定条件

        ① 遇到'\n'

        ② 遇到输入语句时

        ③ 当缓冲区满了4k(一般是4k,根据操作系统会有不同)

        ④ 当程序正常结束时

        ⑤ 手动刷新输出缓冲区fflush(stdout);

3.2输入换冲区

        程序中输入的数据并不会立即从键盘接收到变量中,而是当按下回车后先存储到输入缓冲区中,然后再从缓冲区中读取到变量内存中

        情况1:需要输入的的是整型或浮点型时,而缓冲区中的数据是字符型或符号时,读取会失败,该数据继续残留在输入缓冲区中,会继续影响剩下的输入


解决方法

        根据scanf的返回值判断输入是否有问题,如果读取失败,则先清理缓冲区后重新输入,直到读取成功为止。

        情况2:通过fgets可以指定读取size-1个字符,但是如果输入超过size-1那么字符会残留在输入缓冲区中,继续影响接下来的输入


解决办法

        方法1:

            int len=0;

            while(str[len]) len++;

            if('\n'!= str[len-1])

            {

                canf("%*[^\n]");正则表达式.从缓冲区中读取任意类型数据并丢弃,指导遇到'\n'停止。

                scanf("%*c");从缓冲区中读取任意字符并丢弃

            }

            *注意:任意系统都可以用


        方法2:

            std->_IO_read_ptr = stdin->_IO_read_end;把输入缓冲区的位置指针从当前位置,移动到末尾,相当于清理输入缓冲区

            *注意:只能在linux系统下使用

        情况3:当先输入整型或浮点型再输入字符型时,输入完整型或浮点型后按下的回车或空格会残留在输入缓冲区,刚好被后面的字符型接收,影响输入


解决办法:在%c或者gets()前面加空格scanf(" %c");

4 字符串相关函数

    #include <string.h>

    size_t strlen(const char *s);

    功能:计算字符串长度,不包括'\0'

    char *strcpy(char *dest, const char *src);

    功能:把src拷贝给dest,相当于给dest赋值

    返回值:dest的首地址(链式调用)

    char *strcat(char *dest, const char *src);

    功能:把src追加到dest的末尾,相当于+=

    返回值:dest的首地址(链式调用)

    int strcmp(const char *s1, const char *s2);

    功能:比较两个字符串,根据字典序,谁出现早小,一旦比较出结果就立即返回

    返回值:

                s1>s2 正数

                s1==s2 0

                s1<s2 负数

    char *strstr(const char *haystack, const char *needle);

    功能:在haystack查找是否存在一个子串needle

    返回值:needle在haystack中第一次出现的位置,如果找不到返回NULL

    int sprintf(char *str, const char *format, ...);

    功能:把任意类型的数据转换为字符串并输入到str中

    int sscanf(const char *str, const char *format, ...);

    功能:可以从字符串中解析出各种类型的数据,并存储到对应的变量中。

    void *memcpy(void *dest, const void *src, size_t n);

    功能:把src内存的数据拷贝到n个字节的dest中

    #include <stdlib.h>

    int atoi(const char *nptr);

    功能:把字符串转换成int类型

    long atol(const char *nptr);

    功能:把字符串转换成long类型

    long long atoll(const char *nptr);

    功能:把字符串转换成long long类型

    int atof(const char *nptr);

    功能:把字符串转换成double类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就酱77叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值