/*
题目55: 有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口),输出以下结果
1)    以逗号分割字符串,形成二维数组,并把结果传出;
2)    把二维数组行数运算结果也传出。
strchr(“aa,aa”,’,’ );
请自己定义一个接口(函数)。
要求1:能正确表达功能的要求,定义出接口(函数)(30分);
要求2:正确实现接口(函数),并实现功能(40分);
要求3:编写正确的测试用例。(30分)。
*/
//解析字符串
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//删除空格
int removespace(const char *pin, char *pout);

//解析字符串
int analysistr(const char *pin, char bufstr[8][20], char *requirc);

//打印字符数组
int printfarr09(char parr[8][20]);

void main(){
    //原始字符串(非','结尾)
    const char *p = "abcdef,acccd,eeee,aaaa,e3eeeee,sskss,werertw";
    //原始字符串(','结尾)
    const char *p2 = "abcdef,acccd,eeee,aaaa,e3eeeee,sskss,";
    //新字符串数组
    char bufstr[8][20] = {0};
    //新字符串数组
    char bufstr2[8][20] = { 0 };
    //定义以何种字符作为截取字符
    char ch = ',';
    analysistr(p, bufstr, &ch);
    analysistr(p2, bufstr2, &ch);
    //打印新字符数组
    printfarr09(bufstr);
    system("pause");
}

//打印二维数组
int printfarr09(char parr[8][20]){
    int ERRO_MSG = 0;
    if (parr == NULL)
    {
        ERRO_MSG = 1;
        printf("parr==NULL erro msg:%d", ERRO_MSG);
        return ERRO_MSG;
    }
    //打印二维数组
    for (int i = 0; i < 8; i++)
    {
        printf("%s\n", parr[i]);
    }
    return ERRO_MSG;
}

//删除空格
int removespace(const char *pin, char *pout){
    int ERRO_MSG = 0;
    if (pin == NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    if (pout == NULL)
    {
        ERRO_MSG = 2;
        printf("pout==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    while (*pin != '\0'){
        if (*pin != ' ')
        {
            *pout++ = *pin;
        }
        pin++;
    }
    return ERRO_MSG;
}

//解析字符串
int analysistr(const char *pin, char bufstr[8][20], char *requirc){
    int ERRO_MSG = 0;
    if (pin == NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    if (bufstr == NULL)
    {
        ERRO_MSG = 2;
        printf("bufstr==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    if (requirc == NULL)
    {
        ERRO_MSG = 3;
        printf("requirc==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    //分解字符串
    //strchr函数原型:extern char *strchr(const char *s,char c);查找字符串s中首次出现字符c的位置。
    const char *p = pin;
    const char *ptmp = pin;
    //新字符串个数计数
    int ncount = 0;
    int res = 0;
    //临时存储一段字符串
    char strt[20] = { 0 };
    //用来删除strt中的空格
    char strt2[20] = { 0 };
    while (p != '\0'){
        /*memset是计算机中C / C++语言函数。
        将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值,
        第一个值为指定的内存地址,块的大小由第三个参数指定,
        这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。*/
        //清除字符串缓存,每次循环都会产生字符串缓存
        memset(strt, 0, sizeof(strt));
        memset(strt2, 0, sizeof(strt2));
        p = strchr(p, *requirc);
        if (p == NULL)
        {
            //处理','不作为最后一个符的情况
            //没有找到字符,那么将剩下的所有字符当作一个新字符串
            strcpy(strt, ptmp);
            //删除字符串中的空格
            res = removespace(strt, strt2);
            if (res)
            {
                ERRO_MSG = 4;
                printf("删除空格fuc报错 erro msg:%d", ERRO_MSG);
                return ERRO_MSG;
            }
            //处理','作为最后一个符的情况
            if (strlen(strt2)>1)
            {
                //将新字符串拷贝到数组里
                strcpy(bufstr[ncount], strt2);
            }
            break;
        }
        else{
            //此时ptmp在开头,p指针在字符','第一次出现的地方
            strncpy(strt, ptmp, p - ptmp);
            //删除字符串中的空格
            res = removespace(strt, strt2);
            if (res)
            {
                ERRO_MSG = 4;
                printf("删除空格fuc报错 erro msg:%d", ERRO_MSG);
                return ERRO_MSG;
            }
            if (strlen(strt2)>1)
            {
                //将新字符串拷贝到数组里
                strcpy(bufstr[ncount], strt2);
                ncount++;
            }
            //重新初始化指针
            ptmp = p = p + 1;
        }
    }
    return ERRO_MSG;
}

 

C语言 百炼成钢19_百炼成钢