黑马程序员技术交流社区

标题: 分享今天遇到的一个题目:英文句子首字母换成大写 [打印本页]

作者: wxy19891017    时间: 2015-4-21 18:09
标题: 分享今天遇到的一个题目:英文句子首字母换成大写
本帖最后由 wxy19891017 于 2015-4-22 15:23 编辑

#import <Foundation/Foundation.h>

//定义一个函数,将小写字母转换成大写字母
char upper(char c);

int main()
{
    //存储用户输入的数据
    char str[100];
   
    //提示输入并接收
    printf("请输入一段英文句子:\n");
    //如果使用scanf不能完整接收带有空格的字符串
    gets(str);
   
    //定义一个指针指向数组首元素
    char *p = str;
   
    //判断首字母是不是大小写
    *p = upper(*p);
   
    //*p不遇到'\0'
    while (*p)
    {
        //没有遇到空格,继续
        if (*p !=' ')
        {
            p++;
        }
        //遇到空格,定位到下一个字符,字母小写改成大
        else
        {
            p++;
           *p = upper(*p);
            }
        }
    }
   
    printf("%s",str);
   
   
    return 0;
}

//转大写
char upper(char c)
{
    if (c >= 'a' && c <= 'z')
    {
        return c - 32;
    }
   
    return c;
}

其实网上看了好多,都没有考虑到第一个单词的首字母如果大写的情况。还有就是这里如果用scanf接收数据的话,带有空格的字符串,空格后的字符串都会丢失,所以用了gets。去除了下重复的代码。
作者: 游戏龙    时间: 2015-4-21 20:20
支持一下,我的基础题有这个,实在想不到的话再看
作者: 凌乱    时间: 2015-4-21 20:27
楼主,这个知识点是哪门语言里面涉及的?
作者: ios专用    时间: 2015-4-21 21:41
这个c视频看完就可以做出来吗?
作者: itheima_llt    时间: 2015-4-21 22:45
哪个呦,发这么好的帖子,顶你
作者: 仰望的繁华    时间: 2015-4-21 23:32
既然已经写了char upper(char c)去判断是小写字母则转换。

那么,遇到空格下一位是否需要转换的,直接传进去不就行了。

怎么又写了一遍: if (*p >= 'a' && *p <= 'z') { *p -= 32;}

不要浪费自己写过的功能啊...
作者: wxy19891017    时间: 2015-4-22 08:16
仰望的繁华 发表于 2015-4-21 23:32
既然已经写了char upper(char c)去判断是小写字母则转换。

那么,遇到空格下一位是否需要转换的,直接传进 ...

恩。确实是。忽略了。非常感谢!
作者: wxy19891017    时间: 2015-4-22 08:20
凌乱 发表于 2015-4-21 20:27
楼主,这个知识点是哪门语言里面涉及的?

其实就是C语言就足够了
作者: wxy19891017    时间: 2015-4-22 08:21
ios专用 发表于 2015-4-21 21:41
这个c视频看完就可以做出来吗?

可以,不看完基本也能做出来,单单就是用到了指针和while循环。
作者: 凌乱    时间: 2015-4-22 09:55
wxy19891017 发表于 2015-4-22 08:20
其实就是C语言就足够了

好的,我加紧看完c语言,争取第八期的名额
作者: 枫宇翔    时间: 2015-4-22 10:02
刚才看了一下你的代码,发现你的代码的功能重复了,upper里面的和main里面判断字母的代码是重复,这样不好,太浪费看,你不觉得么
作者: itheima_llt    时间: 2015-4-22 14:47
不错啊! 一个字牛啊!
作者: itheima_llt    时间: 2015-4-22 15:05
不错啊! 一个字牛啊!
作者: 天凉好个秋。。    时间: 2015-4-22 15:14
向楼主学习
作者: wxy19891017    时间: 2015-4-22 15:17
枫宇翔 发表于 2015-4-22 10:02
刚才看了一下你的代码,发现你的代码的功能重复了,upper里面的和main里面判断字母的代码是重复,这样不好 ...

恩,确实是。待改进,我也是新手,谢谢提了建议!
作者: itheima_llt    时间: 2015-4-22 16:25
楼主很棒!
作者: ios专用    时间: 2015-4-22 22:56
wxy19891017 发表于 2015-4-22 08:21
可以,不看完基本也能做出来,单单就是用到了指针和while循环。

:'(  不会做,我c语言部分还没看完
作者: wxy19891017    时间: 2015-4-23 08:58
ios专用 发表于 2015-4-22 22:56
不会做,我c语言部分还没看完

我也是小白,知识看过了,好多题目一眼看上去没什么思路,百度下看下人家写的,大部分又能看懂。这可能就是咱们这种刚开始接触编程都要遇到的,视频上,老师说编程的思想不是一天两天培养出来的,需要在开发中慢慢培养的。
作者: 人生充满期待    时间: 2015-4-23 10:21
代码很不错哦,加油
作者: wxy19891017    时间: 2015-4-23 11:37
人生充满期待 发表于 2015-4-23 10:21
代码很不错哦,加油

太渣渣了,最简单的指针了,对于新手的我,慢慢学吧!
作者: 麻木    时间: 2015-4-23 12:41
楼主 我觉得我写的比你写的略好,理由如下:
请指正
  1. /**
  2. *7.输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)
  3. */

  4. #include <stdio.h>

  5. int main(int argc, const char * argv[])
  6. {
  7.     //1.提示用户输入一个英文句子
  8.     printf("请输入一个英文句子,回车确定\n");
  9.    
  10.     //2.新建一个大小为100的字符串用于存储用户输入的英文句子
  11.     char sentence[100];
  12.    
  13.     //3.系统输入赋值给sentence字符串变量 这里scanf函数第一个参数为"%[^\n]",表示接受空格作为输入,不然默认空格是输入结束符
  14.     scanf( "%[^\n]", sentence);
  15.    
  16.     //4.新建length变量用于存贮字符串的长度
  17.     unsigned long length = strlen(sentence);
  18.    
  19.     //5.因为第一个字母通常就是第一个单词的首字母 所以直接变大写字母,就算是空格,使用toupper函数不变
  20.     sentence[0] = toupper(sentence[0]);
  21.    
  22.     //6.循环遍历字符串数组 如果遇到一个空格和空格后面是一个字符的情况 就调用toupper函数对空格后面的字符做大写处理
  23.     for(int i = 1;i < length-1;i++)
  24.     {
  25.         //6.1当前遍历元素是空格
  26.         if(0x20== sentence[i])
  27.         {
  28.             //6.2后面那个字符还是空格吗?
  29.             if(0x20 != sentence[i+1])
  30.             {
  31.                 //6.3是,则大写处理
  32.                 sentence[i+1] = toupper(sentence[i+1]);
  33.             }
  34.         }
  35.     }
  36.    
  37.     //7.输出转换好的英文句子给用户
  38.     printf("转换后的句子为\n");
  39.     printf("%s\n",sentence);
  40.    
  41.     return 0;
  42. }
复制代码

作者: wxy19891017    时间: 2015-4-23 15:06
麻木 发表于 2015-4-23 12:41
楼主 我觉得我写的比你写的略好,理由如下:
请指正

比我写的好的太多了,scanf函数如何接收空格这个我不知道,toupper函数也没见过!我的就像是白话文,你的就是高大上的文言文!学习了,非常感谢!刚刚学习C语言,好多好多方面都是要学习的,根据基础视频勉强能敲出点简单地代码!还是要继续学习的。非常感谢!
作者: wxy19891017    时间: 2015-4-23 15:09
麻木 发表于 2015-4-23 12:41
楼主 我觉得我写的比你写的略好,理由如下:
请指正

我还想知道下,就是这种代码怎么弄下来的?我只会粘贴复制下来!
作者: ruihai    时间: 2015-4-23 15:43
其实用scanf也是可以读取输入的空格哦, 试试 scanf("%[^\n]")
作者: ruihai    时间: 2015-4-23 16:52
scanf("%[^\n]")里面 ^表示非,所以这句意思是读取用户输入的所有非换行字符,当然也就包括空格啦
作者: hexue1027    时间: 2015-4-23 16:55
不错不错,楼主提的很好 用gets
作者: wxy19891017    时间: 2015-4-23 17:21
ruihai 发表于 2015-4-23 16:52
scanf("%[^\n]")里面 ^表示非,所以这句意思是读取用户输入的所有非换行字符,当然也就包括空格啦 ...

恩。非常感谢,学习了!
作者: ios专用    时间: 2015-4-24 23:43
wxy19891017 发表于 2015-4-23 08:58
我也是小白,知识看过了,好多题目一眼看上去没什么思路,百度下看下人家写的,大部分又能看懂。这可能就 ...

确实,而且基础要弄好




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