• <C> getchar()函数 如何把getchar()到的字符串存起来的实际应用


    一.getchar()

    1.返回值:返回读到的ASCⅡ码值

    2.使用方法:

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     char c;
     6     while((c = getchar()) != '
    ')
     7     {
     8         printf("%c",c);
     9     }
    10 
    11     return 0;
    12 }

    3.功能:从输入缓冲区中读取一个字符 是一个阻塞函数(目前了解就好 后面应该有机会学到这方面的知识)

    二.如何把getchar()到的字符串存起来?

    1.引入:

    我们首先应该思考的问题:“内存申请问题”

    我们并不知道所要输入的字符串是多长的 那么我们应该怎么申请这块空间来存这个字符串呢

    申请的太大 空间浪费 申请的太小 肯定存不下就是了 这可咋整(突然冒出东北话)

    直接定义长度的那种方法就肯定不行了 所以 不妨试试malloc(我觉得ok)

    2.假设:现在我要输入1234567890

    3.基本思路:

    ①先申请一个长度为5的空间 把所get到的字符一个一个存进去

    当存到倒数第二个空间的时候 而且你还没输完!(警报警报 您的内存已经不够用)

    这个时候我们把最后一个空间 存为''

    把最后一个空间存为''的目的是:为了让目前所存的这些字符变成一个字符串(你猜我要拿这个字符串干啥 嘻嘻)

    ②申请一个更大的空间 比如:长度=长度+5

    先把之前的字符串拷贝到这个新的字符串里

    然后从''的位置继续放get到的字符

    以此类推..

    4.函数实现:(注释感觉敲重要 你要不要考虑看一下)

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 
     5 char* GetString();
     6 
     7 int main()
     8 {
     9     char* p = GetString();
    10     printf("%s
    ",p);
    11 
    12     return 0;
    13 }
    14 
    15 char* GetString()
    16 {
    17     char c;
    18 
    19     int nSize = 5;
    20     //初始长度
    21     int nCount = 0;
    22     //用来标记存了多少个字符
    23 
    24     char* str = (char*)malloc(sizeof(char)*nSize);
    25     //创建一个字符数组 初始长度为5
    26     char* pMark = str;
    27     //让pMark指针始终指在字符数组的首元素的位置
    28     char* newStr = NULL;
    29 
    30     while((c = getchar()) != '
    ') //只要没敲回车 存储就一直进行
    31     {
    32         *str = c;
    33         str ++;
    34         nCount ++;
    35 
    36         if(nCount + 1 == nSize) //如果存的元素是内存的倒数第二个空间了
    37         {
    38             *str = '';
    39             //让它变成一个字符串
    40             nSize += 5;
    41             //空间长度变大
    42             newStr = (char*)malloc(sizeof(char)*nSize);
    43             //申请一个新的空间
    44 
    45             strcpy_s(newStr,nSize,pMark);
    46             //用pMark!!!注意这里一定要用pMark拷贝!!!因为str已经动了 str指的已经不是头了 我打两遍这里都打错了
    47 
    48             free(pMark);
    49             pMark = NULL;
    50             //释放就不用我说了吧
    51 
    52             str = newStr + nCount;
    53             //让str指在拷贝过来的字符串''的位置 以便继续存字符
    54             pMark = newStr;
    55             //重点!!让pMark指在新的字符串头的位置
    56         }
    57     }
    58     //循环往复 直到你敲回车 结束输入
    59 
    60     *str = '';
    61     //让它做自己 让它做一个完美的字符数组
    62     return pMark;
    63 }

    敲黑板:在第45行 拷贝老字符串的时候 一定要用pMark拷贝 因为pMark才指向老字符串的头!!!

    PS:敲啊敲 敲啊敲 敲好几遍还是会犯错(跟自己生气气) 熟能生巧吧 码的大脖筋疼

  • 相关阅读:
    zabbix监控
    ipv4固定ip地址
    CentOS7 内核优化 修改参数
    流媒体服务器 red5
    linux安装git
    zabbix-钉钉报警媒介
    Windows下利用IIS建立网站并实现局域网共享
    docker的简单操作和端口映射
    docker概述和安装及基本操作
    VMware Workstation创建Windows2012server虚拟机
  • 原文地址:https://www.cnblogs.com/Aaaaaalei0612/p/8834487.html
Copyright © 2020-2023  润新知