Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68624
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 154
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-12 22:56
个人简介

不卑不亢

文章分类

全部博文(17)

文章存档

2016年(1)

2015年(13)

2014年(3)

分类: C/C++

2014-10-31 14:47:57


点击(此处)折叠或打开

  1. /* 程序功能:用户输串单词,完成单词的反序, 并计算单词的长度.
  2.  * 如:I Love China, 将其变为 China Love I.
  3.  *
  4.  * 解题思路:
  5.  * 1.首先将整个字符串倒置,如 anihC evoL I
  6.  * 2.再遍历每个单词,将其倒置
  7.  *
  8.  * 程序说明:该程序只考虑用户输入的大小写,其它字符默认转换成空格处理.
  9.  * 创建时间:2014-10-31
  10.  * 作者:elijah
  11.  * */

  12. #include <stdio.h>

  13. #define BUFF_SIZE 1024
  14. #define IS_LETTER(ch) ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))

  15. int get_data(char *dest, int num);
  16. int reverse_words(char *str);
  17. void swap(char *head, char *tail);

  18. int main()
  19. {
  20.     char buf[BUFF_SIZE];
  21.     int length;
  22.     length = get_data(buf, BUFF_SIZE);
  23.     reverse_words(buf);
  24.     puts(buf);
  25.     printf("length = %d\n", length);

  26.     return 0;
  27. }

  28. void swap(char *head, char *tail)
  29. {
  30.     while (head < tail) {
  31.         *head ^= *tail;
  32.         *tail ^= *head;
  33.         *head++ ^= *tail--;
  34.     }
  35. }

  36. int reverse_words(char *str)
  37. {
  38.     char *head = str,
  39.          *tail = str;

  40.     while ('\0' != *tail)    /*将尾指针定位到字符串的尾部*/
  41.         tail++;

  42.     swap(head, tail - 1);    /*将整个字符串倒置*/

  43.     while ('\0' != *head) {

  44.         while (32 == *head) /*找单词的头*/
  45.             head++;
  46.         tail = head;

  47.         while (32 != *tail && '\0' != *tail)    /*找到单词的末尾*/
  48.             tail++;
  49.         swap(head, tail - 1);
  50.         head = tail;    /*将头指向尾, 为下次做准备*/
  51.     }

  52.     return 0;
  53. }

  54. int get_data(char *dest, int num)
  55. {
  56.     char ch;
  57.     int count = 0;

  58.     /*校验模块*/
  59.     if (NULL == dest || num < 1)
  60.         return -1;

  61.     while ('\n' != (ch = getchar()) && count < num - 1) {
  62.         /*使用宏函数判断用户输入*/
  63.         if (!IS_LETTER(ch))
  64.             ch = 32;
  65.         dest[count++] = ch;
  66.     }
  67.     dest[count] = '\0';
  68.     
  69.     return count;
  70. }

阅读(1510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~