Lesson25 PoEdu培训第二课 C语言篇(17) 字符串处理函数2 随堂作业
文章类别: 培训作业 0 评论

Lesson25 PoEdu培训第二课 C语言篇(17) 字符串处理函数2 随堂作业

文章类别: 培训作业 0 评论

老师未批改

1. 编写一个函数, 参数为获取字符个数, 传入的字符串, 并将获取到的字符存储在外部传入的字符串中, 使用printf输出结果.

程序源代码:

/*************************************************************************
    > 文件名: lesson25.hw.01.c
    > 作者: 花心胡萝卜
    > 邮箱: hxhlb@hxcarrot.com 
    > 创建时间: 2016-10-10 17:23:39
 ************************************************************************/

#include <stdio.h>

#define STRLEN 255

int _strncpy(const char* strSource, char* strDist, size_t szBufLen) {
    size_t sz = 0;
    for (; sz < szBufLen - 1; sz++) {
        if (*(strSource + sz) == '\0') {
            break;
        }
        *(strDist + sz) = *(strSource + sz);
    }
    *(strDist + ++sz) = '\0';
    return 0;
}

int main() {
    char* str = "1234567890";
    printf("当前已经定义的字符串为:[%s]\n", str);
    char strDist[STRLEN] = { 0 };
    
    _strncpy(str, strDist, 5);
    printf("复制5个后的字符串为:[%s]\n", strDist);
    _strncpy(str, strDist, 10);
    printf("复制10个后的字符串为:[%s]\n", strDist);
    _strncpy(str, strDist, 15);
    printf("复制15个后的字符串为:[%s]\n", strDist);

    return 0;
}

运行效果:
Alt 运行效果

2. 将函数 strchr, strrchr, strstr 函数的功能实现一次.

程序源代码:

/*************************************************************************
    > 文件名: lesson25.hw.02.c
    > 作者: 花心胡萝卜
    > 邮箱: hxhlb@hxcarrot.com 
    > 创建时间: 2016-10-10 17:51:08
 ************************************************************************/

#include <stdio.h>
#include <string.h>

char* _strchr(const char* strSrc, char ch) {
    int iIndex = 0;
    _Bool bFindResult = 0;
    char* strResult = NULL;

    for (; iIndex < strlen(strSrc); iIndex++) {
        if (ch == *(strSrc + iIndex)) {
            bFindResult = 1;
            break;
        }
    }
    if (bFindResult) {
        strResult = strSrc + iIndex;
    }

    return strResult;
}

char* _strrchr(const char* strSrc, char ch) {
    int iIndex = 0;
    _Bool bFindResult = 0;
    char* strResult = NULL;

    for (iIndex = strlen(strSrc) - 1; iIndex >= 0; iIndex--) {
        if (ch == *(strSrc + iIndex)) {
            bFindResult = 1;
            break;
        }
    }
    if (bFindResult) {
        strResult = strSrc + iIndex;
    }

    return strResult; 
}

char* _strstr(const char* strSrc, const char* strFind) {
    int iIndex = 0;
    _Bool bFindResult = 0;
    char* strResult = NULL;

    for (; iIndex < strlen(strSrc); iIndex++) {
        if (strncmp((strSrc + iIndex), strFind, strlen(strFind)) == 0) {
            bFindResult = 1;
            break;
        }
    }
    if (bFindResult) {
        strResult = strSrc + iIndex;
    }

    return strResult;
}

int main() {
    char* strSrc = "Hades Studio http://www.hxhlb.net";
    char* strFind = "hxhlb";
    
    printf("测试字符串1为:[%s]\n测试字符串2为[%s]\n\n", strSrc, strFind);

    printf("测试_strchr查找字符 'S':[%s]\n", _strchr(strSrc, 'S'));
    printf("测试_strchr查找字符 ':':[%s]\n", _strchr(strSrc, ':'));
    printf("测试_strchr查找字符 'm':[%s]\n", _strchr(strSrc, 'm'));
    printf("测试_strrchr查找字符 't':[%s]\n", _strrchr(strSrc, 't'));
    printf("测试_strrchr查找字符 ':':[%s]\n", _strrchr(strSrc, ':'));
    printf("测试_strrchr查找字符 'm':[%s]\n", _strrchr(strSrc, 'm'));

    printf("\n使用字符串1查找字符串2:[%s]\n", _strstr(strSrc, strFind));
    printf("\n使用字符串1查找字符串\"hades\":[%s]\n", _strstr(strSrc, "hades"));
    return 0;
}

运行效果:

Alt 运行效果

3. 编写一个程序, 实现字符串反转.

程序源代码:

/*************************************************************************
    > 文件名: lesson25.hw.03.c
    > 作者: 花心胡萝卜
    > 邮箱: hxhlb@hxcarrot.com 
    > 创建时间: 2016-10-10 19:40:42
 ************************************************************************/

#include <stdio.h>
#include <string.h>

#define STR_LEN 255

int reverseStr(const char* strSrc, char* strDist, size_t szSize) {
    int iStrLen = strlen(strSrc) > (szSize - 1) ? szSize - 1 : strlen(strSrc);
    char* pStr = strSrc;
    int iIndex = 0;
    for (; iIndex < iStrLen; iIndex++) {
        *(strDist + iStrLen - iIndex - 1) = *(pStr + iIndex);
    }
    *(strDist + iStrLen + 1) = '\0';
    return iIndex;
}

int main() {
    char strResult[STR_LEN] = { 0 };
    char* strSrc = "Hades Studio http://www.hxhlb.cn";
    reverseStr(strSrc, strResult, STR_LEN);
    printf("反转字符串[%s]为[%s]\n", strSrc, strResult);
    return 0;
}

运行效果:

Alt 运行效果

4. 要求用户输入一个简单公式(10+3), 两位数加法, 根据公式计算值.

程序源代码:

/*************************************************************************
    > 文件名: lesson25.hw.04.c
    > 作者: 花心胡萝卜
    > 邮箱: hxhlb@hxcarrot.com 
    > 创建时间: 2016-10-10 22:46:17
 ************************************************************************/

#include <stdio.h>

#define STR_LEN 255

long analyzeCalc(const char* str) {
    long lResult = 0;
    char strs[STR_LEN] = { 0 };

    strncpy(strs, str, STR_LEN);

    char* end = NULL, end2 = NULL;
    int i = 0;
    // 删除表达式前的非数字字符
    while(*(strs+i) < '0' || *(strs+i) > '9') {
        i++;
    }
    // 获取第一个数字
    long a = strtol(strs+i, &end, 10);
    printf("%ld ", a);
    i = 0;
    // 删除除了运算符之外的字符
    while(*(end+i) < '0' || *(end+i) > '9') {
        if(*(end+i) != '+'
                && *(end+i) != '-'
                && *(end+i) != '*'
                && *(end+i) != '/') {
            i++;
        } else {
            break;
        }
    }
    // 获取运算符
    char cCalc = *(end + i);
    printf("%c ", cCalc);
    // 跳过运算符
    end += i + 1;
    i = 0;
    // 删除第二个操作数前的非数字字符
    while(*(end+i) < '0' || *(end+i) > '9') {
        i++;
    }
    // 获取第二个操作数
    long b = strtol(end+i, &end2, 10);
    printf("%ld\n", b);

    printf("解析表达式为[%ld] [%c] [%ld] = \n", a, cCalc, b);

    // 开始计算
    switch (cCalc) {
        case '+':
            lResult = a + b;
            break;
        case '-':
            lResult = a - b;
            break;
        case '*':
            lResult = a * b;
            break;
        case '/':
            lResult = a / b;
            break;
        default:
            lResult = 0;
            break;
    }

    return lResult;
}

int main() {
    printf("请输入简单的两数四则运算公式(比如 1+2):\n");
    char strReader[STR_LEN] = { 0 };
    fgets(strReader, STR_LEN, stdin);
    long lResult = analyzeCalc(strReader);
    printf("计算结果为:[%ld]\n", lResult);
    return 0;
}

运行效果:

Alt 运行效果

如有错误,请提出指正!谢谢.

回复