从零开始 学习C/C++的第十七天 字符串2

本文介绍了如何处理C语言编程中输入缓冲区的问题,如scanf和fgets的异常情况,以及提供了解决方案,包括检查返回值、清理输入缓冲区和使用字符串处理函数。同时概述了字符串处理函数如strlen、strcpy、strcat等的用法和注意事项。
摘要由CSDN通过智能技术生成

11.22

输入缓冲区:

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

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

        解决方法:

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

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

        解决方法:

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

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

            scanf ("%*c")       丢弃最后残留的\nint len = 0;

       

            while(str[len]) len++;

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

            {

                scanf ("%*[^\n]");

                scanf ("%*c");

            }

            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 = src

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

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

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

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

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

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

    返回值:

        s1 > s2 正数

        s1 < s2 负数

        s1 == s2  0

   

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

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

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

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

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

    功能:只比较前n个字符

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

#include <stdio.h>

int len(const char* str)
{
    const char *temp = str;
    while(*temp) temp++;
    return temp - str;
}

char* cpy(char* str,const char* str1)
{
    char* temp = str;
    while(*temp++ = *str1++);
    return str;
}

char* cat(char* str,const char* str1)
{
    char *temp = str;
    while(*temp) temp++;
    while(*temp++ = *str1++);
    return str;
}

int cmp(const char* str,const char* str1)
{
    while(*str && *str == *str1) str++,str1++;
    if (*str == *str1)
        return 0;
    if (*str > *str1)
        return 1;
    else
        return -1;
}

int main(int argc,const char* argv[])
{
    char str[256] = "hello";
    //fgets(str,10,stdin);
    printf ("%d\n",len("abcd"));
    printf ("%s\n",cpy(str,"aaa"));
    printf ("%s\n",cat(str,"bbb"));
    printf ("%d\n",cmp("bbc","bc"));
}

    int atoi(const char *nptr);

    功能:字符串转int类型   "123" --> 123

   

    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在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 memcpy(void *dest, const void *src, size_t n);

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

    返回值:

        s1 > s2 正数

        s1 < s2 负数

        s1 == s2  0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值