当前位置:   article > 正文

《明解C语言》示例代码和练习代码[第11章]_"例如,如果接收\"ab1c9\",就返回\"abc\"。注意不要使用下标运算符。"

"例如,如果接收\"ab1c9\",就返回\"abc\"。注意不要使用下标运算符。"

第11章 字符串和指针


示例代码:


示例代码11-1
  1. /*
  2. 用数组实现的字符串和用指针实现的字符串
  3. */
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. char str[] = "ABC"; // 用数组实现的字符串
  8. char *ptr = "123"; // 用指针实现的字符串
  9. printf("str = \"%s\"\n", str);
  10. printf("ptr = \"%s\"\n", ptr);
  11. return (0);
  12. }

示例代码11-2
  1. /*
  2. 用数组实现的字符串和用指针实现的字符串的相同点
  3. */
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. int i;
  8. char str[] = "ABC";
  9. char *ptr = "123";
  10. for (i = 0; str[i]; i++)
  11. putchar(str[i]); // str[i]是第一个字符之后的第i个元素
  12. putchar('\n');
  13. for (i = 0; ptr[i]; i++)
  14. putchar(ptr[i]); // str[i]是第一个字符之后的第i个元素
  15. putchar('\n');
  16. printf("str = \"%s\"\n", str); // str是指向第1个字符的指针
  17. printf("ptr = \"%s\"\n", ptr); // ptr是指向第1个字符的指针
  18. return (0);
  19. }

示例代码11-3
  1. /*
  2. 字符串赋值(?)
  3. */
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. char str[] = "ABC";
  8. char *ptr = "123";
  9. str = "DEF"; // 错误:不能这样赋值
  10. ptr = "456"; // 正确:指向另一个字符串字面量
  11. printf("str = \"%s\"\n", str);
  12. printf("ptr = \"%s\"\n", ptr);
  13. return (0);
  14. }

示例代码11-4
  1. /*
  2. 用数组实现的字符串和用指针实现的字符串(其二)
  3. */
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. char str[6] = "ABC"; // 用数组实现的字符串
  8. char *ptr = "123"; // 用指针实现的字符串
  9. printf("str = \"%s\"\n", str);
  10. printf("ptr = \"%s\"\n", ptr);
  11. return (0);
  12. }

示例代码11-5
  1. /*
  2. 用“数组实现的字符串”的数组和“用指针实现的字符串”的数组
  3. */
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. int i;
  8. char st[3][6] = {"Turbo", "NA", "DOHC"};
  9. char *pt[3] = {"12345", "12", "1234"};
  10. for (i = 0; i < 3; i++)
  11. printf("st[%d] = \"%s\"\n", i, st[i]);
  12. for (i = 0; i < 3; i++)
  13. printf("pt[%d] = \"%s\"\n", i, pt[i]);
  14. return (0);
  15. }

示例代码11-6
  1. /*
  2. 判断字符串的长度(指针版)
  3. */
  4. #include <stdio.h>
  5. // 返回字符串s的长度
  6. size_t str_length(const char *s)
  7. {
  8. size_t len = 0;
  9. while (*s++)
  10. len++;
  11. return (len);
  12. }
  13. int main(void)
  14. {
  15. char st[100];
  16. printf("请输入字符串:");
  17. scanf("%s", st);
  18. printf("字符串%s的长度为%u。\n", st, (unsigned)str_length(st));
  19. return (0);
  20. }

示例代码11-7
  1. /*
  2. 复制字符串
  3. */
  4. #include <stdio.h>
  5. // 将字符串s复制到d
  6. char *str_copy(char *d, const char *s)
  7. {
  8. char *t = d;
  9. while (*d++ = *s++)
  10. ;
  11. return (t);
  12. }
  13. int main(void)
  14. {
  15. char s1[128] = "ABCD";
  16. char s2[128] = "EFGH";
  17. printf("字符串s1:"); scanf("%s", s1);
  18. str_copy(s2, s1);
  19. puts("s1复制到了s2。");
  20. printf("s1 = %s\n", s1);
  21. printf("s2 = %s\n", s2);
  22. return(0);
  23. }

示例代码11-8
  1. /*
  2. 复制字符串(误例)
  3. */
  4. #include <stdio.h>
  5. // 将字符串s赋值到d
  6. char *str_copy(char *d, const char *s)
  7. {
  8. char *t = d;
  9. while (*d++ = *s++)
  10. ;
  11. return (t);
  12. }
  13. int main(void)
  14. {
  15. char str[128] = "ABCD";
  16. char *ptr = "EFGH";
  17. printf("字符串str:"); scanf("%s", str);
  18. str_copy(ptr, str);
  19. puts("str复制到了ptr。");
  20. printf("str = %s\n", str);
  21. printf("ptr = %s\n", ptr);
  22. return(0);
  23. }

示例代码11-9
  1. // 返回字符串s的长度
  2. size_t strlen(const char *s)
  3. {
  4. size_t len = 0;
  5. while (*s++)
  6. len++;
  7. return (len);
  8. }

示例代码11-10
  1. // 将字符串s2添加到s1之后
  2. char *strcat(char *s1, const char *s2)
  3. {
  4. char *tmp = s1;
  5. while (*s1) s1++; // 前进到s1的末尾处
  6. while (*s1++ = *s2++); // 循环复制直至遇到s2中的‘\0’
  7. return (tmp);
  8. }
  9. // 将字符串s2的前n个字符复制到s1
  10. char *strcat(char *s1, const char *s2, size_t n)
  11. {
  12. char *tmp = s1;
  13. while (*s1) s1++; // 前进到s1的末尾处
  14. while (n--)
  15. if (!(*s1++ = *s2++)) break; // 遇到 ‘\0’就结束循环
  16. *s1 = '\0'; // 在s1的末尾插入‘\0’
  17. return (tmp);
  18. }

示例代码11-11
  1. // 将字符串s2添加到s1之后
  2. char *strcat(char *s1, const char *s2)
  3. {
  4. char *tmp = s1;
  5. while (*s1) s1++; // 前进到s1的末尾处
  6. while (*s1++ = *s2++); // 循环复制直至遇到s2中的‘\0’
  7. return (tmp);
  8. }
  9. // 将字符串s2的前n个字符复制到s1
  10. char *strcat(char *s1, const char *s2, size_t n)
  11. {
  12. char *tmp = s1;
  13. while (*s1) s1++; // 前进到s1的末尾处
  14. while (n--)
  15. if (!(*s1++ = *s2++)) break; // 遇到 ‘\0’就结束循环
  16. *s1 = '\0'; // 在s1的末尾插入‘\0’
  17. return (tmp);
  18. }

示例代码11-12
  1. // 比较字符串s1和s2
  2. int strcmp(const char *s1, const char *s2)
  3. {
  4. while (*s1 == *s2) {
  5. if (*s1 == '\0')
  6. return (0); // 相等
  7. s1++;
  8. s2++;
  9. }
  10. return ((unsigned char)*s1 - (unsigned char)*s2);
  11. }
  12. // 比较字符串s1和s2的前n个字符
  13. int strncmp(const char *s1, const char *s2, size_t n)
  14. {
  15. while (n && *s1 && *s2) {
  16. if (*s1 != *s2) // 不相等
  17. return ((unsigned char)*s1 - (unsigned char)*s2);
  18. s1++;
  19. s2++;
  20. n--;
  21. }
  22. if (!n) return (0); // 相等
  23. if (*s1) return (1); // s1 > s2
  24. return (-1); // s1 < s2
  25. }

示例代码11-13
  1. // stoi函数的运行情况
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main(void)
  5. {
  6. char str[] = "12345";
  7. printf("str =\"%s\"\n", str);
  8. printf("atoi(str) = %d\n", atoi(str));
  9. return (0);
  10. }


练习代码:

练习代码e11-1
  1. /*
  2. 依次显示字符串中的字符 (不使用下标运算符)
  3. */
  4. #include <stdio.h>
  5. // 显示字符串(不换行)
  6. void put_string(const char str[])
  7. {
  8. while (*str)
  9. putchar(*str++);
  10. }
  11. int main(void)
  12. {
  13. char str[100];
  14. printf("请输入字符串:");
  15. scanf("%s", str);
  16. put_string(str);
  17. putchar('\n');
  18. return (0);
  19. }

练习代码e11-2
  1. /*
  2. 编写如下函数,若字符串str中含有字符c(若含有多个,以先出现的为准),、
  3. 则返回指向该字符的指针,否则返回NULL。
  4. */
  5. #include <stdio.h>
  6. char *str_chr(const char *str, int c)
  7. {
  8. char *p = NULL;
  9. while (c == *str) {
  10. p = str;
  11. str++;
  12. }
  13. return (p);
  14. }
  15. int main(void)
  16. {
  17. char str[100];
  18. char c;
  19. printf("请输入字符串:"); scanf("%s", str);
  20. getchar(); // 清除缓存
  21. printf("请输入要查找的字符:"); scanf("%c", &c);
  22. printf("\n返回的指针地址是:%p。\n", str_chr(str, c));
  23. return (0);
  24. }

练习代码e11-3
  1. /*
  2. 编写如下函数,不使用下标运算符,返回字符串str中字符c的个数
  3. (若不存在则为0)。
  4. */
  5. #include <stdio.h>
  6. int str_chnum(const char *str, char c)
  7. {
  8. int n = 0;
  9. while (*str) {
  10. if (c == *str++) n++;
  11. }
  12. return (n);
  13. }
  14. int main(void)
  15. {
  16. char str[100];
  17. char c;
  18. printf("请输入字符串:"); scanf("%s", str);
  19. getchar(); // 清除缓存
  20. printf("请输入要查找的字符:"); scanf("%c", &c);
  21. printf("\n字符串\"%s\"中含有%d个字符\'%c\'。\n", str, str_chnum(str, c), c);
  22. return (0);
  23. }

练习代码e11-4
  1. /*
  2. 不使用下标运算符,写出与代码清单9-13中的str_toupper函数
  3. 和str_tolower函数功能相同的函数。
  4. */
  5. #include <ctype.h>
  6. #include <stdio.h>
  7. // 将字符串中的英文字符转换为大写字母
  8. void str_toupper(char *str)
  9. {
  10. while (*str)
  11. *str = toupper(*str++);
  12. }
  13. // 将字符串中的英文字符转换为小写字母
  14. void str_tolower(char *str)
  15. {
  16. while (*str)
  17. *str = tolower(*str++);
  18. }
  19. int main(void)
  20. {
  21. char str[100];
  22. printf("请输入字符串:");
  23. scanf("%s", str);
  24. str_toupper(str);
  25. printf("大写字母:%s\n", str);
  26. str_tolower(str);
  27. printf("小写字母:%s\n", str);
  28. return (0);
  29. }

练习代码e11-5
  1. /*
  2. 不使用下标运算符,编写如下函数,删除字符串str中的所有数字字符
  3. (例如将传入的“AB1C9”变为“ABC”)
  4. */
  5. #include <stdio.h>
  6. // 返回字符串长度
  7. int length(const *str)
  8. {
  9. int len = 0;
  10. while (*str++) len++;
  11. return (len);
  12. }
  13. // 去除字符串中的数字
  14. void del_digit(char *s)
  15. {
  16. char *p = s;
  17. while (*p)
  18. if ((*p >= '0') && (*p <= '9'))
  19. p++;
  20. else
  21. *s++ = *p++;
  22. *s = '\0';
  23. }
  24. int main()
  25. {
  26. char s[100];
  27. printf("请输入字符串:"); scanf("%s", s);
  28. printf("输入的字符串是:%s。\n", s);
  29. del_digit(s);
  30. printf("去数的字符串是:%s。\n", s);
  31. return (0);
  32. }

练习代码e11-6
  1. /*
  2. 编写如下函数,实现与库函数atoi、atol、atof相同的功能。
  3. */
  4. int len(const char *nptr)
  5. {
  6. int len = 0;
  7. while (*nptr++) len++;
  8. return (len);
  9. }
  10. double power_10(long n)
  11. {
  12. double p = 1;
  13. if (n > 0)
  14. while (--n) p *= 10;
  15. else if (n < 0)
  16. while (n++) p /= 10;
  17. else
  18. p = 1;
  19. return p;
  20. }
  21. // 字符串转换为整形
  22. int strtoi(const char *nptr)
  23. {
  24. int n = len(nptr);
  25. int num = 0;
  26. while (*nptr) {
  27. num += (*nptr - '0') * power_10(n--);
  28. nptr++;
  29. }
  30. return (num);
  31. }
  32. // 字符串转换为长整形
  33. long strtol(const char *nptr)
  34. {
  35. long n = len(nptr);
  36. long num = 0;
  37. while (*nptr) {
  38. num += (*nptr - '0') * power_10(n--);
  39. nptr++;
  40. }
  41. return (num);
  42. }
  43. // 字符串转换为浮点形
  44. double strtof(char *nptr)
  45. {
  46. char *p1 = nptr;
  47. char *p2;
  48. char *p3;
  49. int n1 = 0;
  50. int n2 = 0;
  51. int n3;
  52. double num = 0.0;
  53. while (*p1 != '.') {
  54. n1++;
  55. p1++;
  56. }
  57. p2 = ++p1;
  58. p3 = p2;
  59. while (*p3++) n2--;
  60. while (*nptr != '.') {
  61. num += (*nptr - '0') * power_10(n1--);
  62. nptr++;
  63. }
  64. n3 = n2;
  65. while (*p2) {
  66. num += (*p2 - '0') * power_10(n3 - ++n2);
  67. p2++;
  68. }
  69. return (num);
  70. }
  71. int main(void)
  72. {
  73. char s[100];
  74. printf("请输入一个整数:"); scanf("%s", s);
  75. printf("\n转换成整形:%d\n", strtoi(s));
  76. printf("\n请输入一个长整数:"); scanf("%s", s);
  77. printf("\n转换成长整形:%ld\n", strtol(s));
  78. printf("\n请输入一个浮点数:"); scanf("%s", s);
  79. printf("\n转换成浮点形:%lf\n", strtof(s));
  80. return (0);
  81. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法编织者/article/detail/62759?site
推荐阅读
相关标签
  

闽ICP备14008679号