• C语言中动态分配内存的相关练习


    //有一段文本,将文本中的所有单词存放到一个字符串数组中

    typedef struct _mallocStringArray {
    int strlen;
    char* strAddress;
    } MallocStringArray;
    int getStringSeparateMembersCountsBySymbol(const char* str, const char symbol) {
    if (!str) {
    return (-1);
    }

    typedef enum {
    SYMBOL_FLAG = 0, NONE_FLAG = 1,
    } SymbolFlag;

    char* pSymbol = (char*)str;
    int separateCount = 0;/**< 记录以symbol分离出的元素个数 */
    int flag = NONE_FLAG;

    while (*pSymbol) {
    if (flag == NONE_FLAG && *pSymbol != symbol) {
    separateCount++;
    pSymbol++;
    flag = SYMBOL_FLAG;
    continue;
    }

    if (flag == SYMBOL_FLAG && *pSymbol == symbol) {
    pSymbol++;
    flag = NONE_FLAG;
    continue;
    }

    pSymbol++;
    }

    return (separateCount);
    }

    MallocStringArray* mallocArrayStructToStoreSeparateMembers(const char* str, const char symbol, int* getCount) {
    if (!str) {
    return (NULL);
    }

    /**< 移动到 非'指定字符' 时停止用的指针 */
    char* pLetter = (char*)str;
    /**< 移动到 '指定字符' 时停止用的指针 */
    char* pSymbol = NULL;
    int i = 0;
    /**< 按照 '指定字符' 得到分离的字符串的元素的个数 */
    int count = getStringSeparateMembersCountsBySymbol(str, symbol);
    int tmpCount = count;

    MallocStringArray* pMSA = (MallocStringArray*)malloc(sizeof(MallocStringArray) * count);
    if(!pMSA) {
    return (NULL);
    }

    while (tmpCount--) {
    /**< pLetter移动到 非 '指定字符' 时停止 */
    while (*pLetter == symbol) {
    pLetter++;
    }

    /**< pSymbol移动到 '指定字符' 时停止 */
    pSymbol = pLetter + 1;
    while (*pSymbol != symbol && *pSymbol != '') {
    pSymbol++;
    }

    /**< 完成 malloc 操作以及按照定长拷贝字符串 */
    pMSA[i].strlen = (int)(pSymbol - pLetter);
    pMSA[i].strAddress = (char*)malloc(pSymbol - pLetter + 1);
    if (!pMSA[i].strAddress) {
    return (NULL);
    }
    strncpy(pMSA[i].strAddress, pLetter, pSymbol - pLetter);
    pMSA[i].strAddress[pSymbol - pLetter] = '';

    i++;
    pLetter = pSymbol + 1;
    }

    /**< 返回指针以及数组元素的个数 */
    *getCount = count;
    return (pMSA);

    int main(int argc, const char* argv[]) {

    char* p = "撒旦法 是地方 ds";
    int count = 0;
    MallocStringArray* pMSA = mallocArrayStructToStoreSeparateMembers(p, ' ', &count);

    printf("%d ", count);
    for (int i = 0; i < count; i++) {
    printf("%03d -- %s ", pMSA[i].strlen, pMSA[i].strAddress);
    free(pMSA[i].strAddress);
    }

    free(pMSA);

    return (0);
    }

  • 相关阅读:
    慕课网-安卓工程师初养成-3-2 Java中的算术运算符
    慕课网-安卓工程师初养成-3-1 什么是运算符
    慕课网-安卓工程师初养成-2-13 练习题
    慕课网-安卓工程师初养成-2-12 如何在Java中使用注释
    慕课网-安卓工程师初养成-2-11 Java常量
    慕课网-安卓工程师初养成-2-10 Java中的强制类型转换
    试把一个正整数n拆分为若干个
    求解两个给定正整数m、n的最大公约数(m、n)
    统计n!尾部零
    横竖折对称方阵
  • 原文地址:https://www.cnblogs.com/yuanyuandachao/p/3337692.html
Copyright © 2020-2023  润新知