字符串。。

本文详细介绍了字符、字符串及其在计算机中的存储和处理,包括ASCII码、字符输入输出、字符串定义、输入输出函数、字符串操作如复制、比较、转换及常见库函数的使用。同时涵盖了回文串判断、数值转换和字符串逆序等实践练习。

字符:

    字符就是符号或图案,在计算机中以整数形式存储的,需要显示时会根据ASCII码表中的对应关系,来显示出显影的图案或符号

    '\0'    0

    '0'     48

    'A'     65

    'a'     97

    %c      %hhd

   

    char ch;

    字符的输入:

        scanf("%c",&ch);

        getchar();

    字符的输出:

        printf("%c",ch);

        putchar(ch);

串:

    是一种数据结构,由一组连续的若干个相同类型的数据组成,对这种数据结构的处理都是批量性的,在末尾有一个结束标志,处理会从开头到结束标志为止

字符串:

    有字符组成的串行结构,结束标志时'\0'

字符串的输入:

    scanf %s 地址

    不能接受空格,自动在输入结束后,末尾加'\0'

    char *gets(char *s);

    功能:输入字符串,并且可以接受空格

    返回值:链式调用(一个函数的返回值可以作为另一个函数的参数)

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

    功能:可以设置输入的字符串的长度为size-1,超出部分不接受,会给'\0'预留位置

    stream:键盘文件 :标准输入 stdin

    注意:输入的长度不足size-1时,会把最后的 \n 一并接受

    返回值:链式调用

   

字符串的输出:

    printf("%s",地址);

    int puts(const char *s);

    功能:输出一个字符串,并且会在打印完后自动再打印一个换行

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

字符串的存在方式:

    字符数组: char str[10]={'a','b','c'};

        由char字符类型组成的数组,要注意为'\0'预留位置

        初始化不方便

        使用的是栈内存,数据可以修改

    字符串字面值:

        "由双引号包含的若干个字符",在末尾隐藏一个'\0'

        字符串字面值以地址的形式存在,数据存储在代码段中,如果修改会产生段错误,相当于常量

        sizeof("xixi") 计算字符串字面值中所有字符的个数,包括'\0'

        const char* p = "字符串字面值";

        sizeof(p)   永远是4|8

        注意:

    常用方式:

        初始化:字符数组[] = 字符串字面值;

        自动为'\0'预留位置

        复制完成后,字符串就存在两份,一份在代码段,一份在栈内存(可修改)

    练习1:实现一个判断是否是回文串

    练习2:实现一个函数,把一个由数字字符组成的字符串转换成整数值

    练习3:实现一个函数把字符串逆序

输出缓冲区:

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

    缓冲区机制可以提高数据的读写速度,另一方面可以让高速的cpu与低速的输入输出设备之间协调工作

    刷新输出缓冲区的条件:

        1、遇到'\n'

        2、遇到输入函数、语句

        3、当缓冲区满4kb时

        4、当程序结束时

        5、手动刷新fflush(stdout);

输入缓冲区:

    程序并不会立即回去键盘上输入的数据,当按下回车键,程序才会从输入缓冲区中读取数据

        1、当读取整型或者浮点型数据时,如果此时缓冲区中的数据是字母或符号时,此时会读取失败,而且数据会继续残留在缓冲区中,会影响接下来所有数据的读取

            解决方法:

                判断scanf的返回值,如果返回值小于要接受的变量个数,则先清空输入缓冲区,再重新scanf接受,知道全部成功接受为止

                stdin->_IO_read_ptr = stdin->_IO_read_end;

        2、fgets可以指定读取size-1个字符,如果有超出部分会残留在输入缓冲区中,也影响接下来的输入

            解决方法:  

                1、 必须确定缓冲区中有残留数据,否则程序会停下来等待一个\n (看封装代码)

                    scanf("%*[^\n]"); 表示从缓冲区中接受任意字符并丢弃,直到遇到\n才停止

                    scanf("%*c");   丢弃最后残留的\n

                2、 把输入缓冲区的当前位置指针移动到缓冲区末尾,相当于清理输入缓冲区,但是只能在Linux系统下用

                    stdin->_IO_read_ptr = stdin->_IO_read_end;

        3、如果先输入整型、浮点型数据,再输入字符、字符串时,前一次输入的\n会被残留在输入缓冲区中,就会影响下面的字符、字符串的输入

        注意:scanf不影响字符串的输入,但是gets影响

            解决方法:

                1、scanf(" %c",&ch);  %c前面加空格

                2、gets(str)前面加 scanf("%*c");  在缓冲区中读取任意字符并丢弃

字符串相关常用函数:

    #include <string.h>

        size_t strlen(const char *s);

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

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

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

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

        char *strncpy(char *dest, const char *src, size_t n);

        功能:把src前n个字符拷贝给dest

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

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

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

        char *strncat(char *dest, const char *src, size_t n);

        功能:把src前n个字符追加到dest的末尾

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

        功能:比较s1和s2的大小,按照字典序比较谁在前面谁小,一旦比较出结果后,后面的字符不再比较

        返回值:

            s1 > s2 正数

            s1 < s2 负数

            s1 == s2 0

        int strncmp(const char *s1, const char *s2, size_t n);

        功能:只比较前n个字符


 

        作业:实现四个字符串处理函数

        int len(const char *src)

        {

            const char *temp=src;

            while(*temp) temp++;

            return temp - src;

        }

        char *cpy(char *dest,const char *src)

        {

            char *temp = dest;

            while(*temp++=*src++);

            return dest;

        }

        char *cmp(char *dest,const char *src)

        {

            char *temp = dest;

            while(*temp++);

            while(*temp++=*src++);

            return dest;

        }

        int cmp(const char *s1,const char *s2)

        {

            while(*s1 && *s1==*s2) s1++,s2++;

            return *s1-*s2;

        /*    if(*s1 > *s2)

            return 1;

            if(*s1 < *s2)

            return -1;

        */

        }


 

    int atoi(const char *nptr);

    功能:字符串转int类型

       

    long atol(const char *nptr);

    功能:字符串转long类型

    long long atoll(const char *nptr);

    功能:字符串转long long类型

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

    功能:查找haystack中是否存在needle

    返回值:存在时,返回needle再haystack中第一次出现的位置,如果不存在时,返回NULL、

    char *strchr(const char *s, int c);

    功能:查找字符串s中是否有字符c

    返回值:如果找到c,返回c在s中第一次出现的地址,找不到返回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内存位置

    返回值:dest首地址

    int memcmp(const void *s1, const void *s2, size_t n);

    功能:比较两块内存是否相等,按字节比较,比较前n个字节

    返回值:

            s1 > s2 正数

            s1 < s2 负数

            s1 == s2 0

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

    功能:移动src到dest中,就算有重合部分,也不影响正确性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值