程序片段(01):ReplaceAll.c

内容概要:ReplaceAll

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. //01.(删除+替换)所有指定字符串
  6. // (双索引+双指针)-->(删除+替换)原理
  7. // 注:增加(拓展)+删除(压缩)+修改(压缩|不变|拓展)+查询(不变)
  8. void replaceAll(char ** ppSrcStr, char * pOldStr, char * pNewStr)
  9. {
  10. char * pSrcStr = *ppSrcStr;//常量指针-->变量指针(同一本体)-->跨函数间接修改常量指针
  11. int srcStrLen = strlen(pSrcStr);
  12. int oldStrLen = strlen(pOldStr);
  13. int newStrLen = strlen(pNewStr);
  14. char * p1 = pSrcStr;
  15. char * p2 = pSrcStr;
  16. if (oldStrLen == newStrLen)
  17. {
  18. while (*p1 = *p2)
  19. {
  20. int find = 1;
  21. for (int i = 0; i < oldStrLen; ++i)
  22. {
  23. if ('\0' == *(p2 + i) || *(p2 + i) != *(pOldStr + i))
  24. {
  25. find = 0;
  26. break;
  27. }
  28. }
  29. if (!find)
  30. {
  31. ++p2;
  32. ++p1;
  33. }
  34. else
  35. {
  36. for (int i = 0; i < newStrLen; ++i)
  37. {
  38. *(p2 + i) = *(pNewStr + i);
  39. }
  40. }
  41. }
  42. }
  43. else if (oldStrLen < newStrLen)
  44. {
  45. while (*p1 = *p2)
  46. {
  47. int find = 1;
  48. for (int i = 0; i < oldStrLen; ++i)
  49. {
  50. if ('\0' == *(p2 + i) || *(p2 + i) != *(pOldStr + i))
  51. {
  52. find = 0;
  53. break;
  54. }
  55. }
  56. if (!find)
  57. {
  58. ++p2;
  59. ++p1;
  60. }
  61. else
  62. {
  63. int m = p2 - pSrcStr;
  64. int n = p1 - pSrcStr;
  65. pSrcStr = *ppSrcStr = (char *)_recalloc(*ppSrcStr, srcStrLen + newStrLen - oldStrLen + 1, sizeof(char));
  66. p2 = pSrcStr + m;
  67. p1 = pSrcStr + n;
  68. int moveLen = newStrLen - oldStrLen;
  69. for (char * p = p2 + strlen(p2); p >= p2; --p)
  70. {
  71. *(p + moveLen) = *p;
  72. }
  73. for (int i = 0; i < newStrLen; ++i)
  74. {
  75. *(p2 + i) = *(pNewStr + i);
  76. }
  77. }
  78. }
  79. }
  80. else
  81. {
  82. while (*p1 = *p2)
  83. {
  84. int find = 1;
  85. for (int i = 0; i < oldStrLen; ++i)
  86. {
  87. if ('\0' == *(p2 + i) || *(p2 + i) != *(pOldStr + i))
  88. {
  89. find = 0;
  90. break;
  91. }
  92. }
  93. if (!find)
  94. {
  95. ++p2;
  96. ++p1;
  97. }
  98. else
  99. {
  100. for (int i = 0; i < newStrLen; ++i)
  101. {//赋值有效字符串
  102. *(p2 + oldStrLen - newStrLen + i) = *(pNewStr + i);
  103. }
  104. p2 += oldStrLen - newStrLen;//跳过无效字符串
  105. }
  106. }
  107. }
  108. }
  109. int main01(void)
  110. {
  111. int srcStrLen = strlen("12345543211234554321");
  112. char * pStr = (char *)malloc(srcStrLen + 1);
  113. strcpy(pStr, "12345543211234554321");
  114. printf("%s \n", pStr);
  115. //replaceAll(&pStr, "12345", "ABCDE");
  116. //replaceAll(&pStr, "123", "ABCDE");
  117. replaceAll(&pStr, "12345", "ABC");
  118. printf("%s \n", pStr);
  119. system("pause");
  120. }

程序片段(02):获取最长数字串.c

内容概要:寻找母串当中最长的数字子串

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main01(void)
  4. {
  5. char * pInputStr = "abc12345hij1234321jkl1237ol";
  6. char * pMaxNumStr = NULL;
  7. int maxNumLen = 0;
  8. char * pChr = pInputStr;//指向普通字符的指针
  9. while (*pChr)
  10. {
  11. while (!('0' <= *pChr && *pChr <= '9'))
  12. {
  13. ++pChr;
  14. }
  15. char * pNum = pChr;//指向数字字符的指针
  16. while ('0' <= *pChr && *pChr <= '9')
  17. {
  18. ++pChr;
  19. }
  20. if (pChr - pNum > maxNumLen)
  21. {
  22. maxNumLen = pChr - pNum;
  23. pMaxNumStr = pNum;
  24. }
  25. }
  26. printf("%d \n", maxNumLen);
  27. for (int i = 0; i < maxNumLen; ++i)
  28. {
  29. putchar(*(pMaxNumStr + i));
  30. }
  31. system("pause");
  32. }

程序片段(03):数组.c

内容概要:递归的高级形式判定数组是否递增

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int loopJudge(int * pArr, int num)
  4. {
  5. for (int i = 0; i < num - 1; ++i)
  6. {
  7. if (*(pArr + i) > *(pArr + i + 1))
  8. {
  9. return 0;
  10. }
  11. }
  12. return 1;
  13. }
  14. //01.递归的高级形式:
  15. // 通过逻辑运算符建立递归关系
  16. int recurJudge(int * pArr, int num)
  17. {
  18. if (1 == num)//保证判定式成立
  19. return *(pArr + 0) < *(pArr + 1);
  20. //形成整体表达式
  21. return *(pArr + num - 2) < *(pArr + num - 1) && recurJudge(pArr, num - 1);
  22. }
  23. int main01(void)
  24. {
  25. int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  26. //printf("%d \n", loopJudge(arr, 10));
  27. printf("%d \n", recurJudge(arr, 10));
  28. system("pause");
  29. }

程序片段(04):01.数组最大值.c+02.冒泡求最大值.c

内容概要:取数组最大值循环递归

  1. ///01.数组最大值.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int maxNumByLoop(int * pArr, int num)
  5. {//打擂算法
  6. int maxNum = *(pArr + 0);
  7. for (int i = 1; i < num; ++i)
  8. if (maxNum < *(pArr + i))
  9. maxNum = *(pArr + i);
  10. return maxNum;
  11. }
  12. int maxNumByRecur(int * pArr, int num, int maxValue)
  13. {
  14. if (0 == num)//表达式恒成立
  15. {
  16. if (maxValue < *(pArr + 0))
  17. {
  18. maxValue = *(pArr + 0);
  19. }
  20. return maxValue;
  21. }
  22. if (maxValue < *(pArr + num - 1))
  23. {//直接数组个数
  24. maxValue = *(pArr + num - 1);
  25. }
  26. maxNumByRecur(pArr, num - 1, maxValue);
  27. }
  28. int main02(void)
  29. {
  30. int arr[10] = { 1, 4, 5, 9, 18, 13, 2, 0, 12, 8 };
  31. printf("maxValue = %d \n", maxNumByLoop(arr, 10));
  32. printf("maxValue = %d \n", maxNumByRecur(arr, 10, 0));
  33. system("pause");
  34. }
  1. ///02.冒泡求最大值.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. static int maxNumByRecur(int * pArr, int num)
  5. {//递归算法
  6. if (1 == num)
  7. {
  8. if (*(pArr + 0) < *(pArr + 1))
  9. {
  10. *(pArr + 0) = *(pArr + 0) ^ *(pArr + 1);
  11. *(pArr + 1) = *(pArr + 0) ^ *(pArr + 1);
  12. *(pArr + 0) = *(pArr + 0) ^ *(pArr + 1);
  13. }
  14. return *(pArr + 0);
  15. }
  16. if (*(pArr + num - 2) < *(pArr + num - 1))
  17. {
  18. *(pArr + num - 2) = *(pArr + num - 2) ^ *(pArr + num - 1);
  19. *(pArr + num - 1) = *(pArr + num - 2) ^ *(pArr + num - 1);
  20. *(pArr + num - 2) = *(pArr + num - 2) ^ *(pArr + num - 1);
  21. }
  22. maxNumByRecur(pArr, num - 1);
  23. }
  24. int main02(void)
  25. {
  26. int arr[10] = { 1, 2, 3, 4, 15, 18, 4, 3, 2, 1 };
  27. //for (int i = 0; i < 10 - 1; ++i)
  28. //{//冒泡算法
  29. // if (*(arr + i) > *(arr + i + 1))
  30. // {
  31. // *(arr + i) = *(arr + i) ^ *(arr + i + 1);
  32. // *(arr + i + 1) = *(arr + i) ^ *(arr + i + 1);
  33. // *(arr + i) = *(arr + i) ^ *(arr + i + 1);
  34. // }
  35. //}
  36. //printf("maxNum = %d \n", *(arr + 10 - 1));
  37. printf("maxNum = %d \n", maxNumByRecur(arr, 10));
  38. system("pause");
  39. }

程序片段(05):01.大数乘法.c+02.大数乘法递归.c

内容概要:大数乘法

  1. ///01.大数乘法.c
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. //01.大数乘法原理解析:
  7. // 1 2 3
  8. // 4 5 6
  9. //--------------------
  10. // 6 12 18
  11. // 5 10 15
  12. // 4 8 12
  13. // 4 13 28 27 18
  14. // 5 6 0 8 8
  15. //注:图形化方式进行解析
  16. void largeNumMul(char * pMultiplicand, char * pMultiplicater, char * pResult)
  17. {
  18. int candLen = strlen(pMultiplicand);
  19. int caterLen = strlen(pMultiplicater);
  20. int places = 0;
  21. for (int j = caterLen - 1, n = 0; j >= 0; --j, ++n)
  22. {
  23. if (0 == *(pMultiplicater + j))
  24. {
  25. continue;
  26. }
  27. int r1 = 0, r2 = 0;
  28. char * pTmpStr = (char *)calloc(2048, sizeof(char));
  29. int m = 0;
  30. for (int i = candLen - 1, m = 0; i >= 0; --i, ++m)
  31. {
  32. r1 = (*(pMultiplicand + j) - '0') * (*(pMultiplicater + i) - '0');
  33. r2 = *(pTmpStr + m + n) + r1;
  34. *(pTmpStr + m + n) = r2 % 10;//纵向累加
  35. *(pTmpStr + m + n + 1) = r2 / 10;//横向进位
  36. }
  37. for (places = 0, r2 = 0; places <= m + n + 1 || r2; ++places)
  38. {
  39. r1 = *(pResult + places) + *(pTmpStr + places) + r2;
  40. *(pResult + places) = r1 % 10;//纵向保留
  41. r2 = r1 / 10;//横向进位
  42. }
  43. }
  44. for (int k = places - 1; k >= 0; --k)
  45. {
  46. if (*(pResult + k))
  47. {
  48. for (int l = 0; l <= k / 2; ++l)
  49. {
  50. char tmpChr = *(pResult + l);
  51. *(pResult + l) = *(pResult + k - l);
  52. *(pResult + k - l) = tmpChr;
  53. }
  54. return;
  55. }
  56. }
  57. *(pResult + 0) = '0';
  58. return;
  59. }
  60. int main01(void)
  61. {
  62. char multiplicand[1024] = { 0 };
  63. char multiplicater[1024] = { 0 };
  64. char result[2048] = { 0 };
  65. scanf("%s%s", multiplicand, multiplicater);
  66. largeNumMul(multiplicand, multiplicater, result);
  67. printf("%s * %s = %s \n", multiplicand, multiplicater, result);
  68. system("pause");
  69. }
  1. ///02.大数乘法递归.c
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <time.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #define MAX_SIZE 100
  8. char str1[MAX_SIZE], str2[MAX_SIZE], str3[MAX_SIZE * 2];
  9. void Init()
  10. {
  11. for (int i = 0; i < MAX_SIZE * 2; i++)
  12. str3[i] = '0';
  13. }
  14. void CalcJ(int n, int m, int inc)
  15. {
  16. if (m >= 0)
  17. {
  18. int tmp = (str2[n] - '0') * (str1[m] - '0') + inc + str3[m + n + 1] - '0';
  19. str3[m + n + 1] = tmp % 10 + '0';
  20. inc = tmp / 10;
  21. CalcJ(n, m - 1, inc);
  22. }
  23. else if (n >= 0)
  24. {
  25. if (inc > 0)
  26. {
  27. int tmp = str3[m + n + 1] - '0' + inc;
  28. str3[m + n + 1] = tmp % 10 + '0';
  29. inc = tmp / 10;
  30. CalcJ(n - 1, m, inc);
  31. }
  32. }
  33. }
  34. void Work(int n, int m)
  35. {
  36. if (n == -1)
  37. {
  38. return;
  39. }
  40. else
  41. {
  42. CalcJ(n, m, 0);
  43. Work(n - 1, m);
  44. }
  45. }
  46. void Print()
  47. {
  48. for (int i = 0; i < strlen(str3); i++)
  49. if (str3[i] != '\0')
  50. printf("%d", str3[i] - '0');
  51. printf("\n");
  52. }
  53. int main1()
  54. {
  55. scanf("%s%s", str1, str2);
  56. Init();
  57. Work(strlen(str2) - 1, strlen(str1) - 1);
  58. Print();
  59. system("pause");
  60. return EXIT_SUCCESS;
  61. }

程序片段(06):C99新语法.c

内容概要:C99新语法

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //01.C99新语法之数组的静态初始化方式:
  4. // 1.根据指定索引实现精确初始化
  5. // 2.其中最大的那个索引代表着最后一个数组元素的位置
  6. // 3.该初始化方式属于栈内存的静态初始化方式
  7. // 4.未能初始化到的元素被默认初始化为0
  8. int main01(void)
  9. {
  10. int arr[] = { [0] = 1,[1] = 2,[2] = 3,[15] = 10 };
  11. printf("sizeof(arr) = %d \n", sizeof(arr));
  12. for (int i = 0; i < sizeof(arr) / sizeof(*(arr + 0)); ++i)
  13. {
  14. printf("%d \n", *(arr + i));
  15. }
  16. system("pause");
  17. }
  18. //02.C99新语法之静态指定初始化注意事项:
  19. // 1.采用变量指针进行保存数组栈内存首地址的时候
  20. // 需要明确静态初始化的解析类型
  21. // 2.严格区分常量指针还是变量指针
  22. // 注:free();函数只能指定回收堆内存空间
  23. void testStaticArr()
  24. {
  25. int * pArr = (int[]) { [1] = 3, [5] = 2 };
  26. printf("pArr = %p \n", pArr);
  27. //free(pArr);//free();函数不能回收栈内存
  28. for (int i = 0; i < 6; ++i)
  29. {
  30. printf("%d \n", *(pArr + i));
  31. }
  32. }
  33. int main02(void)
  34. {
  35. testStaticArr();
  36. system("pause");
  37. }
  38. //03.C99新语法之结构体变量的指定初始化方式:
  39. // 1.结构体变量的指定初始化方式
  40. // 2.没有被指定初始化的内容会被按照变量内存块儿
  41. // 的特点清为0
  42. //注:结构体和数组的普通变量都可以直接采用指定初始化方式
  43. // 进行初始化,无需明确解析类型(指针方式需要)
  44. //04.C99新语法之布尔类型的变量:
  45. // 用于存储逻辑值
  46. struct MyStruct
  47. {
  48. int num;
  49. float fl;
  50. double db;
  51. _Bool b;
  52. } myStruct = { .num = 10,.fl = 10.9,.db = 19.8,.b = 0 };
  53. //05.有关数组维度的省略特点:
  54. // 所有数组,都可以省略其最高维度数(括号维度保留),用于表明该数组的类型
  55. // 如果是指向数组的指针,就需要在省略最高维度之后的方括号前面添加(*pArr)
  56. // 注:指向数组的指针(简称数组指针)-->这是一种标准数组的声明方式
  57. int main03(void)
  58. {
  59. printf("%d, %f, %lf, %d \n", myStruct.num, myStruct.fl, myStruct.db, myStruct.b);
  60. getchar();
  61. //指向结构体的指针-->变量指针-->需要明确解析方式-->可以静态初始化-->可以指定初始化
  62. struct MyStruct * pMyStruct = (struct MyStruct[]) { [0] = { .num = 10 ,.fl = 10.9 ,.db = 19.8,.b = 0 } ,
  63. [1] = { .num = 10 }
  64. };
  65. system("pause");
  66. }
  67. #define MYPRINT(...) printf(__VA_ARGS__);
  68. //06.C99新语法之带参宏的定义方式:
  69. // 1.带参宏的定义格式:
  70. // #define 带参宏名(...) 表达式(__VA_ARGS__)
  71. // 2.解释:
  72. // (...):表示传递进来的可变参数
  73. // __VA__ARGS:代表可变参数的应用位置
  74. // 注:三个点儿...-->采用-->__VA_ARGS进行整体替换
  75. int main04(void)
  76. {
  77. MYPRINT("%d, %s \n", 10, "Hello China!");
  78. system("pause");
  79. }
  80. //07.C99新语法之内联函数:
  81. // C语言当中的内联函数用于避免函数不断的进出栈
  82. // 将该函数保留在特有的栈内存当中!(避免不断进出栈)
  83. __inline void go()
  84. {
  85. printf("gogogo \n");
  86. }
  87. int main05(void)
  88. {
  89. go();
  90. printf("%p \n", go);
  91. system("pause");
  92. }

20160219.CCPP体系详解(0029天)的更多相关文章

  1. 20160129.CCPP体系详解(0008天)

    程序片段(01):函数.c+call.c+测试.cpp 内容概要:函数 ///函数.c #include <stdio.h> #include <stdlib.h> //01. ...

  2. 20160226.CCPP体系详解(0036天)

    程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> ...

  3. 20160208.CCPP体系详解(0018天)

    程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: ...

  4. 20160206.CCPP体系详解(0016天)

    代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地 ...

  5. 20160205.CCPP体系详解(0015天)

    程序片段(01):01.杨辉三角.c 内容概要:杨辉三角 #include <stdio.h> #include <stdlib.h> #define N 10 //01.杨辉 ...

  6. 20160204.CCPP体系详解(0014天)

    程序片段(01):define.h+data.h&data.c+control.h&control.c+view.h&view.c+AI.h&AI.c+main.c 内 ...

  7. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...

  8. 20160128.CCPP体系详解(0007天)

    以下内容有所摘取,进行了某些整理和补充 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节 ...

  9. 20160127.CCPP体系详解(0006天)

    程序片段(01):msg.c 内容概要:线程概念 #include <stdio.h> #include <stdlib.h> #include <Windows.h&g ...

随机推荐

  1. 二 Djano模型层之模型字段选项

    字段选项 以下参数是全部字段类型都可用的,而且是可选的 null 如果为True,Django将在数据库中将空值存储为NULL.默认值为False 对于字符串字段,如果设置了null=True意味着& ...

  2. [SPOJ 4155]OTOCI

    Description 题库链接 给你 \(n\) 个节点,让你兹磁以下操作,维护一棵树: 动态加边: 修改点权: 询问路径上点权和. \(1\leq n\leq 30000\) Solution 好 ...

  3. POJ2449 Remmarguts' Date

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

  4. 【HNOI2017】影魔

    题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着自 ...

  5. 【BZOJ1483】【HNOI2009】梦幻布丁

    题意:n个连续的点,有若干种颜色,每个颜色会因为某些操作变为另一种颜色,动态查询颜色段数. 解题思路:对每个颜色开一棵平衡树启发式合并应该是最裸的想法,但是我们有更优的! 考虑对每个颜色利用链表储存它 ...

  6. hdu 1890 splay树

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  7. 一则利用内核漏洞获取root权限的案例【转】

    转自:https://blog.csdn.net/u014089131/article/details/73933649 目录(?)[-] 漏洞描述 漏洞的影响范围 漏洞曝光时间 漏洞产生的原因 漏洞 ...

  8. 缓冲区(buffer)与缓存(cache)

    下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区, ...

  9. eclipse创建web项目修改路径

  10. 使用Fiddler改变线上js文件的引用路径

    一般的项目开发都是先在本地环境开发,测试环境中完成测试,最后再提交到线上环境. 但是由于版本构建工具有时出现bug或者一些缓存的因素导致测试环境代码可能和线上不一样,这是多么蓝瘦的事情.此处说的是在原 ...