黑马程序员技术交流社区

标题: 基础测试题自我分析(四) [打印本页]

作者: Morning_jcg    时间: 2015-11-6 15:50
标题: 基础测试题自我分析(四)


/*********************************************************************************


以下为本人的基础测试题,所表答案为我的答案,分析也是自己的理解,如有不对,还望指正。


**********************************************************************************/
编程题4:
输入一英文句子,将其中所有单词首字符转换成大写后输出。
我的源码:


  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 1000

  4. int main(){
  5.         char a[MAX];
  6.         int i, len, flag = 0;
  7.         gets(a);
  8.         len = strlen(a);
  9.         for ( i = 0; i < len; i++){
  10.                 if ( flag == 0 && a[i] <= 'z' && a[i] >= 'a'){
  11.                         a[i] -= 32;
  12.                         flag = 1;
  13.                 }
  14.                 if ( a[i] == ' ' || a[i] == ',' || a[i] == '.' ){
  15.                         flag = 0;
  16.                 }
  17.                 printf("%c",a[i]);
  18.         }
  19.         return 0;
  20. }
复制代码
嗯,这比前两题强多了。我的想法是这样的,首先我要把句子分割成多个单词,而单词与单词直接的分割无非是空格,逗号和句号。于是我设置了一个flag,默认为0.然后开始遍历这字符串数组。当一个新的单词开始是这个flag应该是0,然后此时读到的字母是首字母,所以我把它大写(asc码-32),同时设置flag为1.意思是这个单词的首字母我已经大写了,下面如果没进入一个新的单词的话我就不干活了。然后当读到空格逗号和句号的时候,我明白了,上一个单词结束了,如果之后再读到字母,那应该是下个单词的首字母了,又要大写了,所以要把flag重新置零,以此循环。遍历结束也就处理结束了。我还是一遍遍历一边输出的,因为不想写第二个循环,因为懒。



作者: zyios    时间: 2015-11-6 17:48
占个沙发
作者: xiaobei    时间: 2015-11-6 18:17
对的,说得明白
作者: arhui    时间: 2015-11-6 20:53
写的好清楚了
作者: 谁在放荡    时间: 2015-11-6 21:18
顶一个,学习下
作者: jeffdy66    时间: 2015-11-6 22:14
大神,求赐教赐教呀
作者: jeffdy66    时间: 2015-11-6 22:15
大神,求赐教赐教呀,刚学C还不会
作者: 陌忆    时间: 2015-11-6 22:37
直接遍历整个数组就好了,你都把小写的改成大写的了
作者: Morning_jcg    时间: 2015-11-7 11:48
陌忆 发表于 2015-11-6 22:37
直接遍历整个数组就好了,你都把小写的改成大写的了

只有首字母,不信你试试。
作者: Morning_jcg    时间: 2015-11-7 11:49
jeffdy66 发表于 2015-11-6 22:14
大神,求赐教赐教呀

啊?我不是大神啊,,我就会一点c而已,,你要问什么==
作者: poxiao    时间: 2015-11-7 11:55
这是我的代码 希望跟楼主一起参考参考
  1. /*输入一个英文句子,将其中所有单词首字符装换成大写后输出*/
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<ctype.h>
  5. int main()
  6. {
  7.         char s[1024];
  8.         size_t lenth, i = 0;
  9.         fgets(s, 1024, stdin);
  10.         lenth = strlen(s);
  11.         s[0] = toupper(s[0]);
  12.         while (i++ < lenth)
  13.         {
  14.                 if (isspace(s[i]))
  15.                 {
  16.                         i++;
  17.                         s[i] = toupper(s[i]);
  18.                 }
  19.         }
  20.         printf("%s", s);
  21.         return 0;
  22. }
复制代码

作者: Morning_jcg    时间: 2015-11-7 12:16
poxiao 发表于 2015-11-7 11:55
这是我的代码 希望跟楼主一起参考参考


<ctype.h>是啥啊,,好多函数没见过,不知道干嘛的。。
作者: poxiao    时间: 2015-11-8 20:04
额、、、ctype.h是一个C语言标准库,代码里面的toupper还有isspace都是这个标准库里面的,第一个是将字符转换为大写,第二个是判断是不是空格符
作者: Morning_jcg    时间: 2015-11-8 21:27
poxiao 发表于 2015-11-8 20:04
额、、、ctype.h是一个C语言标准库,代码里面的toupper还有isspace都是这个标准库里面的,第一个是将字符转 ...

哦!这么好用!学习了,,
作者: zhecipinle    时间: 2015-11-9 12:46
学到很多,赞一个!
作者: 伍陶陶    时间: 2015-11-9 13:40
不错,但是我认为不太简洁。应该有更好的ngfa
作者: 李坤小太阳    时间: 2015-11-9 14:24
简洁明了。。。
作者: gbl19920226    时间: 2015-11-9 14:27
楼主的C语言基本功很扎实
作者: 649685603    时间: 2015-11-9 16:59
好羡慕 我什么时候能有这么厉害 加油
作者: Morning_jcg    时间: 2015-11-9 21:32
649685603 发表于 2015-11-9 16:59
好羡慕 我什么时候能有这么厉害 加油

额,,其实这一点都不厉害,,这种程度多做点练习就好了。
作者: Morning_jcg    时间: 2015-11-9 21:38
gbl19920226 发表于 2015-11-9 14:27
楼主的C语言基本功很扎实

谢谢夸奖
作者: 865393462    时间: 2015-11-9 22:09
厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2