当前位置:   article > 正文

自学嵌入式第十四天C语言篇13

自学嵌入式第十四天C语言篇13

目录

指针+一维字符型数组

        const用法 

        处理字符串

        memcpy


 

指针+一维字符型数组

        const用法 

                const char *s        const表示只读        此时const限定的是基类型,表示不能通过*s的方式修改基类型。

                char const *s                                        此时还是const限定的是基类型,表示不能通过*s的方式修改基类型。

                char * const s                                        此时const限定指针变量s,表示s只读,不能修改指针变量s       

                就近原则:const离谁近就限定谁

                应用:1.如果不想通过*p方式修改基类型对应的数据,就选择const int * p;

                           2.指针变量p定义好后,不想再指向别的变量,就选择int *const p;

                使用const的好处:

                        1.能提前发现代码中的问题,将运行时的问题提前到编译时显示出来

                        2.能够接收可修改变量和常量两种。

        处理字符串

                以下是用指针完成的与字符串相关的函数的代码

  1. //puts输出字符串
  2. int Puts(const char *s)
  3. {
  4. if (s == NULL)
  5. {
  6. return -1;
  7. }
  8. while (*s != '\0')
  9. {
  10. printf("%c",*s);
  11. s++;
  12. }
  13. putchar('\n');
  14. return 0;
  15. }
  16. //gets从键盘获取字符串,存到s中,返回s的首地址
  17. char *Gets(char *s)
  18. {
  19. char *ret = s;
  20. while ((*s = getchar()) != '\n')
  21. {
  22. s++;
  23. }
  24. *s = '\0';
  25. return ret;
  26. }
  27. //strlen计算字符串中的长度,返回长度
  28. int Strlen(const char *s)
  29. {
  30. int len = 0;
  31. while (*s != '\0')
  32. {
  33. len++;
  34. s++;
  35. }
  36. return len;
  37. }
  38. //strcpy将源字符串复制到目标字符串
  39. char *Strcpy(char *dest,const char *src)
  40. {
  41. char *ret = dest;
  42. while (*src != '\0')
  43. {
  44. *dest = *src;
  45. dest++;
  46. src++;
  47. }
  48. *dest = '\0';
  49. return ret;
  50. }
  51. //strncpy复制源目标字符串中的n个字符,如果n大于原字符串的长度,目标字符串能被称为字符串,n小于源字符串长度时,只保证复制了n个字符,目标字符数组中不一定有停止标志
  52. char *Strncpy(char *dest,const char *src,size_t n)
  53. {
  54. char *ret = dest;
  55. while (n--)
  56. {
  57. if (*src != '\0')
  58. {
  59. *dest = *src;
  60. dest++;
  61. src++;
  62. }
  63. else
  64. {
  65. *dest = '\0';
  66. dest++;
  67. }
  68. }
  69. return ret;
  70. }
  71. //strcat拼接字符串
  72. char *Strcat(char *dest,const char *src)
  73. {
  74. char *ret = dest;
  75. while (*dest != '\0')
  76. {
  77. dest++;
  78. }
  79. while (*src != '\0')
  80. {
  81. *dest = *src;
  82. dest++;
  83. src++;
  84. }
  85. *dest = '\0';
  86. return ret;
  87. }
  88. //可以控制要将源字符串中的几个字符拼接过去,并一定构成字符串
  89. char *Strncat(char *dest,const char *src,size_t n)
  90. {
  91. char *ret = dest;
  92. while (*dest != '\0')
  93. {
  94. dest++;
  95. }
  96. while (n && *src != '\0')
  97. {
  98. *dest = *src;
  99. src++;
  100. dest++;
  101. n--;
  102. }
  103. *dest = '\0';
  104. return ret;
  105. }
  106. //strcmp比较两个字符串的大小
  107. int Strcmp(const char *s1,const char *s2)
  108. {
  109. while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
  110. {
  111. s1++;
  112. s2++;
  113. }
  114. return *s1 - *s2;
  115. }
  116. //可以规定比较的范围
  117. int Strncmp(const char *s1,const char *s2,size_t n)
  118. {
  119. while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0' && --n)
  120. {
  121. s1++;
  122. s2++;
  123. }
  124. return *s1 - *s2;
  125. }

        补充:为什么strcpy和strcat要设计成返回字符串的首地址?

                再变量中定义了a,b,c;可以完成连续赋值,即a=b=c=10;这两个函数设计成返回字符串的首地址也是为了可以完成类似操作,即链式操作,如 strcpy(s1,strcpy(s2,"hello"));

        memcpy

                memcpy也能完成字符串的复制,但其功能更强大的地方在于,它不止能完成字符串的复制,任意类型的数组都能进行复制,完成过程如下:

  1. //memcpy完成过程
  2. void *Memcpy(void *dest,const void *src,size_t n)
  3. {
  4. char *p = (char *)dest; //dest为空类型,memcpy是一个字节一个字节进行复制,所以将其强转成char *类型
  5. const char *q = (char *)src;
  6. while (n)
  7. {
  8. *p = *q;
  9. p++;
  10. q++;
  11. n--;
  12. }
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/969353
推荐阅读
相关标签
  

闽ICP备14008679号