A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庞佳星 中级黑马   /  2015-7-28 10:55  /  1900 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)
#include<stdio.h>
int main()
{
        int i,zimu;
        char a[100];
        printf("Please enter a sentence:");//定义一句话放在同一个数组里包括空格和字母
        scanf("%s",a);
        zimu=a[0]-32;//先对首写字母进行大写,因为ASCII代码与整形数据可以相加
        printf("%c",zimu);
        for(i=1;i<100;i++)
        {
                if(a[i]==' ')//碰见空格,下个字母大写
                {
                        zimu=a[i+1]-32;
                    printf("%c",zimu);
                }
                if(a[i]=='\0')//如果有结束标识符跳出循环
                {
                        break;
                }
                if(a[i]!='\0'&&a[i]!=' ')//如果不是上边两种,直接输出该位置的字母
                {
                        printf("%c",a[i]);
                }
        }
}
只能输出第一个单词,为什么啊!!!头疼。

24 个回复

倒序浏览
孙虾米 来自手机 中级黑马 2015-7-28 11:06:10
沙发
我也在刚学习,看不出来
回复 使用道具 举报
孙虾米 发表于 2015-7-28 11:06
我也在刚学习,看不出来

加个好友吧,一起交流

点评

ok 1005432416  发表于 2015-7-28 11:45
回复 使用道具 举报
一起交流
回复 使用道具 举报
用  scanf   输入字符串的时候只要 遇到空格 程序就认为输入结束
回复 使用道具 举报
scanf不能接收空格,你可以用fgets()接收空格
你把  scanf("%s",a);这句话换成fgets(a,100,stdin);    a是你定义的数组名,100是数组长度,stdin表示接收输入。
还有,你没发现你的程序不止这个问题么。
当你输入abc的时候,它会打出Aabc.
你要把最后一个输出语句 printf("%c",a[i]);改成printf("%c",a[i+1]);
你自己在理一遍思路,看看~
回复 使用道具 举报
爱生活爱程序 来自手机 中级黑马 2015-7-28 11:56:23
7#
scanf遇到空格和回车键就结束,可以用gets()接收
回复 使用道具 举报
也可以使用gets()函数
gets(a);
但是使用它时会提示不安全,当输入字符超过字符串的时候,就会有问题。
fgets()函数输入时,当输入字符超过字符串长度的时候,它不会接收了,他只会接收字符串长度-1个字符,
还留一个位置存放结束字符‘\0’
回复 使用道具 举报
xch184415359 来自手机 中级黑马 2015-7-28 12:12:59
9#
看不懂啊:'(:'(
回复 使用道具 举报
本帖最后由 挚兀嘟 于 2015-8-21 09:21 编辑

努力学习中
回复 使用道具 举报 1 0
你把scanf换成gets试一下。。。
回复 使用道具 举报
不对吧 scanf 不是遇到空格了没事吗?应该是接受字符的事情把
回复 使用道具 举报
你的方法:1.没有修改原本的数组,只是输出做了修改,反倒不如修改原数组方便,二没有考虑如果本来就是大写字母呢,三,如果是数字呢??,所以我改了改程序,以下,以供交流。
#include<stdio.h>
#include<string.h>
int main()
{
        int i,zimu;
        char a[100];
        printf("Please enter a sentence");
        gets(a);
        if(a[0]>='a'&&a[0]<='z')
        {
        a[0]=a[0]-32;|
        }
        for(i=1;i<strlen(a);i++)
        {
                if((a[i]==' ')&&(a[i+1]>='a'&&a[i+1]<='z'))
                {
                      a[i+1]=a[i+1]-32;
                }
        }
        printf("%s",a);
       return 0;
}
回复 使用道具 举报 1 0
飞翔的猪 发表于 2015-7-29 10:22
你的方法:1.没有修改原本的数组,只是输出做了修改,反倒不如修改原数组方便,二没有考虑如果本来就是大写 ...

谢谢哈!自己也查了一部分最后的代码是这样
#include<stdio.h>
int main()
{
        int i,Capital;
        char string[100],c;
        printf("Please enter a sentence:");       //定义一句话放在同一个数组里包括空格和字母
        gets(string);
        Capital=string[0]-32;                      //先对首写字母进行大写,因为ASCII代码与整形数据可以相加
        printf("%c",Capital);
        for(i=1;(c=string!='\0');i++)           //如果遇到结束标示符,通知循环
        {
                if(string==' ')                 //碰见空格,对空格后的字母的ASCII码进行处理,但是该位置输出空格符
                {
                        string[i+1]=string[i+1]-32;
                        printf(" ");
                }
                else                               /*因为以前已经对空格后的字母进行ASCII码的变化,所以空格后输出
                                                                                   的为大写字母 其他字母原样输出*/
                {
                        printf("%c",string);
                }
        }
}
回复 使用道具 举报
刘唐飞 发表于 2015-7-29 01:50
不对吧 scanf 不是遇到空格了没事吗?应该是接受字符的事情把

恩恩,谢谢哈
回复 使用道具 举报
wy911011 发表于 2015-7-28 12:03
也可以使用gets()函数
gets(a);
但是使用它时会提示不安全,当输入字符超过字符串的时候,就会有问题。

恩恩,谢谢哈,查了scanf和gets()的区别,最终明白了,很谢谢你。
回复 使用道具 举报

好的qq1042664124
回复 使用道具 举报
挚兀嘟 发表于 2015-7-28 15:34
你看一下这样写会不会更好理解一些

int main(int argc, const char * argv[]) {

谢谢,fgets语句学懂了,谢谢
回复 使用道具 举报
飞翔的猪 发表于 2015-7-29 10:22
你的方法:1.没有修改原本的数组,只是输出做了修改,反倒不如修改原数组方便,二没有考虑如果本来就是大写 ...

当时我并没有考虑的那么全,没有考虑到数字,或者大写字母,你这个算法比我那个更好,感觉比我那个更贴近实际运用,非常谢谢你,懂了。
回复 使用道具 举报
ivae0 初级黑马 2015-7-30 10:03:57
20#
scanf不能接收空格,看看基础视频里的scanf的用法
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马