C语言指针实战篇——输入输出姓名,查找字符串出现次数

2019.12.17

Demo(一)输入输出姓名

输出姓名.png

如图是实现效果,基本原理是用多个一级字符指针(即字符数组)来存储输入的名字,然后再用一个二级字符指针存储这些一级字符指针,输入(存储)完毕全部一起输出

下图为原理解释
输入图解.png

输出图解.png

下面是代码实现

#include "stdafx.h"
#include"stdlib.h"
char*input(){
    char*name;//定义存储一个名字的字符指针
    int i=1;
    printf("请输入名字:");
    fflush(stdin);
    while(1){
        char a=getchar();
        if(i==1){
            name=(char*)malloc(1*sizeof(char));
            //分配空间后就变成了一个可以存字符的字符数组
            name[i-1]=a;//指针与数组的转换
            //由于%s遇到空格会自动停止录入字符,所以采取输一个,存一个
        }else{
            //输入一个字符就分配一个空间,避免了内存的浪费
            name=(char*)realloc(name,i*sizeof(char));
            name[i-1]=a;
        }
        if(a=='\n'){
            name[i-1]='\0';
            //停止输入时一定要在末尾加上\0,表示字符串的结束,避免输出的时候输出乱码
            break;
        }
        i++;//计数器,用于空间分配控制
    }
    return name;
    //返回指针,本质返回存储字符的数组的首地址
}
bool isContinue(){
    while(1){
        fflush(stdin);
        printf("是否继续(y/n)?");
        char b=getchar();
        if(b=='y'){
            return true;
        }else if(b=='n'){
            return false;
        }else{
            printf("输入格式不正确请重新输入!\n");
        }
    }
}
//判断是否继续输入名字
char** inItail(int*count){
    int j=1;
    char**p=NULL;
    //定义存储一级的二级指针
    while(1){
        if(j==1){
            p=(char**)malloc(1*sizeof(char*));
            p[j-1]=input();
        }else{
            p=(char**)realloc(p,j*sizeof(char*));
            //输入一个名字分配一个空间
            p[j-1]=input();
        }
        if(isContinue()==false){
            break;
        }
        j++;
    }
    *count=j;
    return p;
}
void show(int count,char**name2){
    for(int i=0;i

Demo(二)查找字符串出现次数

Description:输入一串字符,然后再输入你想查找的字符串,然后便会显示要查找的字符串在你输入的字符串中出现的次数,下图为运行效果
运行效果.png
#include "stdafx.h"
#include"stdlib.h"
char* input(int*length){
    char*p1;//定义字符指针存储字符串
    int i=1;
    printf("请输入一串字符:");
    fflush(stdin);//清空缓冲区,避免回车符的干扰
    while(1){
        char a=getchar();
        if(i==1){
            p1=(char*)malloc(1*sizeof(char));
            p1[i-1]=a;
        }else{
            p1=(char*)realloc(p1,i*sizeof(char));
            p1[i-1]=a;
        }
        if(a=='\n'){
            p1[i-1]='\0';//不要忘记\0
            break;
        }
        i++;
    }
    *(length)=i-1;//地址传递改变length的值
    return p1;//返回指针即首地址
}
char* input2(int*length){
    printf("请输入查找的字符串:");
    char*p2=NULL;
    int i=1;
    fflush(stdin);
    while(1){
        if(i==1){
            p2=(char*)malloc(1*sizeof(char));
        }else{
            p2=(char*)realloc(p2,i*sizeof(char));
        }
        char a=getchar();
        if(a=='\n'){
            p2[i-1]='\0';
            break;
        }
        p2[i-1]=a;
        i++;
    }
    *(length)=i-1;
    return p2;
}
void compareShow(){
    int length1=0,length2=0,count=0;
    char*p1=input(&length1);
    char*p2=input2(&length2);
    for(int i=0;i
图解1.png

说明:重新分配内存使用的是realloc,而不是再次使用malloc
另外一个小问题如图

图解2.png

也许有人会对内层循环里面的p1[i+j]!=p2[j]有小疑问,如图便是产生问题的情况,
在原字符串的末尾,因为i,j满足均满足循环条件,而h,j也满足目标字符串的前两个,所以它还会继续向右进行比较,而此时原字符串貌似无法移动了,到尽头了,p1[i+j]即p[7]那是不是数组下标就越界了呢,其实原字符串有八个元素,末尾为‘\0’,所以无论你理论上算出越了多少界,它都会break,因为'\0'永远不会等于你要查找的字符

你可能感兴趣的:(C语言指针实战篇——输入输出姓名,查找字符串出现次数)