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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#include<stdio.h>
void main()
{
        char a[50];
        int i;
        scanf("%s",&a);
        for(i=0;a[i]!='\0';i++)
        {if(i=0)
                        a[0]-=32;
                else if(a[i]=32)
                        a[i+1]-=32;
       
                else a[i]=a[i];}
                printf("%s",a);
       
}

12 个回复

倒序浏览
本帖最后由 Meniny 于 2014-8-16 08:37 编辑

先说语法:
首先光说scanf的话,不应该用&a,应该直接写a,因为你的a是个数组然后,你可以用fgets来进行输入,你这样输入的话遇到空格就断开了,比如我输入hello there的话there就没了
还有,if里面是==而不是=,因为不是赋值


再说思路:
你这样的办法,没用考虑某个单词首字母本来就是大写的情况,比如我输入Dec就会输出$ec

我给你一个例子吧:
  1. /*
  2. 6、 输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)
  3. */

  4. #include <stdio.h>

  5. int main()
  6. {
  7.     //提示输入英文句子
  8.     printf("请输入一段英文句子:\n");
  9.     //定义一个变量来接收
  10.     char sen[100];
  11.     //定义一个指针,指向数组首个元素
  12.     char *p = sen;
  13.     //输入句子
  14.     fgets(sen,99,stdin);
  15.     //第一个字母大写,当然你也可以用函数
  16.     *p -= 32;
  17.     //循环直到句子结束
  18.     while (*p != '\0')
  19.     {
  20.         //判断,如果当前的字符不是空格,则继续
  21.         if(*p != ' ')
  22.         {
  23.             p++;
  24.         }
  25.         //如果是空格,则定位到下一个字符,如果该字符是小写字母,则改为大写
  26.         else if (*p == ' ')
  27.         {
  28.             p++;
  29.             if (*p >= 97 && *p <= 122)
  30.             {
  31.                 *p -= 32;
  32.             }
  33.         }
  34.     }
  35.     //输出修改后的句子
  36.     puts(sen);
  37.     return 0;
  38. }
复制代码




回复 使用道具 举报
分享一下我的代码
  1. #include <stdio.h>
  2. #define STRINGLENGTH 100
  3. char upper(char c);

  4. int main()
  5. {
  6.     printf("请输入一英文句子:\n");
  7.     char str[STRINGLENGTH] ; gets(str);
  8.    
  9.     //先对首字符执行upper操作
  10.     str[0] = upper(str[0]);
  11.     int i=0;
  12.     while(str[i])
  13.     {
  14.         //对空格后的字符执行upper操作,空格的ASCLL码为32
  15.         if(str[i] == 32)
  16.         {
  17.             str[i+1]=upper(str[i+1]);
  18.         }
  19.         i++;
  20.     }
  21.     printf("%s\n",str);
  22.     return 0;
  23. }


  24. char upper(char c)
  25. {
  26.     if(c >= 'a' && c <= 'z')
  27.     {
  28.         //大写字母的ASCLL码比小写字母小32
  29.         return c-32;
  30.     }else { return c;}
  31. }
复制代码

点评

师兄,人家只是该单词首字母耶,你都改了扣分,哈哈  发表于 2015-7-30 17:21
回复 使用道具 举报
都在调适代码啊
回复 使用道具 举报
过来学习学习
回复 使用道具 举报
首先 不应该是&a 这个是表示获得a的内存地址 以下是我写的 有说明 希望对你有帮助
#include <stdio.h>

int main()
{
    //定义一个长度为100的字符数组
    char x[100];

    //定义整形变量i
    int i;

    //输入提示信息
    printf("请输入英文句子\n");

    //获得输入的英文句子
    gets(x);

    //先判断x[0]是否是小写
    if(x[0]>'a'&&x[0]<'z')
    {
        //首位字母变大写 因为在ASCII码中小写字母比大写字母大32
        x[0]=x[0]-32;
    }
   

    //做循环 x[i]不等于字符结束的时候
    for (i=1;x[i]!='\0';i++)
    {
    //做判断,如果x[i-1]等于空格
          if (x[i-1]==' ')
          {
      //在做判断x[i]是否是小写字母
          if(x[i]>'a'&&x[i]<'z'){
               
        //那么他的后一位减去32变大写
              x[i]=x[i]-32;
        }
          }
    }
    //做循环 x[i]不等于字符结束的时候
    for (i=0;x[i]!='\0';i++)
    {

    //输出改变之后的字符串
         printf("%c",x[i]);

     }

}

点评

最靠谱的答案了,暂时,谢谢!  发表于 2015-7-30 17:26
回复 使用道具 举报
ke     yu   ta   .............
回复 使用道具 举报
有众大神回复了,我就来学习学习吧
回复 使用道具 举报
都是大神啊!!!!!!!!!!!
回复 使用道具 举报
看了楼上的代码,大家都把首字母单拿出来做判断,其实也可以把它放在循环里,详见代码
  1. #include <stdio.h>

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

  4.     @autoreleasepool {
  5.         //定义一个临时字符存储
  6.         char c;
  7.         //定义存储字符串的数组s
  8.         char s[100];
  9.         //定义一个循环变量
  10.         int i = 0;
  11.         //计算大小写ASCII码差值
  12.         int aA ='a' - 'A';
  13.         
  14.         printf("请输入一个英文句子: ");
  15.         //循环接收输入的字符串
  16.         while((c = getchar()) != '\n')
  17.             s[i++] = c;
  18.         //给输入的字符串加上结束标示
  19.         s[i] = '\0';
  20.         
  21.         //循环变量i清零
  22.         i = 0;
  23.         //循环遇到字符串结束标志'\0'结束
  24.         while( s[i] != '\0')
  25.         {
  26.             //如果前一个字符是空格或者是第一个字符,那么该字符是一个新单词的开始,并判断该字符是否为小写
  27.             if( (s[i-1]==' ' || i==0) && s[i] >= 'a' )
  28.             //减去大小写差值,变小写为大写
  29.             s[i] -= aA;
  30.             //循环变量自增1
  31.             i++;
  32.         }
  33.         //输出字符串
  34.         printf("%s\n", s);
  35.     }
  36.     return 0;
  37. }
复制代码




回复 使用道具 举报
5、 输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)
#include <stdio.h>
int main(int argc, const char * argv[])
{
     char str[100]; //申明一个字符数组
         int i=0;
     int word=0;//标识是否为单词 0表示为单词,1表示不是单词
     int count=0;//统计单词个数
    printf("请输入一句英文:\n");   
    //从键盘输入英文单词
    gets(str);
    printf("当前输入的英文句子是:");
    puts(str);
    //循环遍历
    while (str[i] != '\0') {
        if(str[i] == ' '){
            //设置为单词
            word=0;
        }else if (word == 0){
            count++;
            //将单词字母大写
            str[i]=str[i]-32;
            word=1;
        }
        i++;
    }
    printf("所有单词首字符转换成大写后输出后的英文句子是:");
    puts(str);
    return 0;
}
6、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
#include<stdio.h>
int main(){
    char str[100]="it is necessary for us all to make efforts to cultivate good manners";
        int length=0;//定义计算单词长度计数器
        int maxLength=0;//定义单词最大长度
        int index=0;//定义单词最后一位字符的下标
        int i=0;
        //循环查找最大单词的多字母的下标
    for(i=0;str[i] != '\0';i++){
                if(str[i] !=' '){
                        length++;
                    if(length>maxLength){
            index=i;
            maxLength=length;
                        }
                }else{
                        length=0;
                }
        }
    printf("当前英文句子:\n%s\n",str);
        printf("最长单词:\n");
        //循环打出最长单词
        for(i=maxLength;i != 0;i--){
                printf("%c",str[index-i+1]);
        }
        printf("\n");
}
7、 输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。(C语言编程题)
#include<stdio.h>
int main(){
        int a=0,b=0;
        int sum=0;//和
        int cha=0;//差
        int cj=0;//乘积
        int shang=0;//商值
        int ys=0;//余数
        printf("请输入两个数并且以','号隔开:");
        scanf("%d,%d",&a,&b);
//        scanf("%d",&b);
        sum=a+b;
        cha=a-b;
        cj=a*b;
        if(b != 0){
             shang=a/b;
                ys=a%b;
        }else{
                printf("b不能为0\n");
        }
        printf("两数之和为%d\n",sum);
        printf("两数之差为%d\n",cha);
        printf("两数之积为%d\n",cj);
        printf("两数之商为%d\n",shang);
        printf("两数之余为%d\n",ys);
}
8、 编写一个int string_len(char *s),返回字符串s的字符长度(不包括\0)  (C语言编程题)
#include<stdio.h>
//求字符串的长度
int string_len(char *s){
        int length=0;
        int i;
        for(i=0;s[i] != '\0';i++){
                length++;
        }
    return length;
}
int main(){
   char str[100];
   int len=0;
   printf("请输入字符串\n");
   gets(str);
   len= string_len(str);
  printf("字符串的字符长度是%d\n",len);
}
9、 从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)
#include<stdio.h>
#include<string.h>
int main(){
    int i=0,j=0;
        char str[6][50];
        for(i=0;i<6;i++){
                printf("请输入第%d个字符串(仅仅包含英文字母和数字):",i+1);
            scanf("%s",str[i]);
        }
//比较字符串
        for(i=0;i<6;i++){
                for(j=0;j<5;j++){
                        if(strcmp(str[i],str[j])<0){
                                char tem[50];
                                strcpy(tem,str[i]);
                    strcpy(str[i],str[j]);
                                strcpy(str[j],tem);
                        }
                }
        }
        printf("这6个字符串从小到大排列并输出结果:\n");
        for(i=0;i<6;i++){
                printf("第%d个字符串:%s\n",i+1,str[i]);
        }
        printf("\n");
}
10、 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
#include<stdio.h>
int sumOfDays(int y,int m,int d);
int main(){
    int year,month,day;
        do{
                printf("请输入2006年1月1日以后的某一天:\n");
                scanf("%d%*c%d%*c%d",&year,&month,&day);
        }while(year<2006 || (month<1 || month>12) || (day<1 || day>31));
        sumOfDays(year,month,day);
}
int sumOfDays(int y,int m,int d)
{
     int i,j;
         int sumDays=0;//总天数
         int DaysOfYear=0;//年总天数
         int DaysOfMonth=0;//月总天数
         int leapYearMonths[12]={31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年的每月天数
         int simpleYearMonths[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // 平年每月天数
         int xcYear=y-2006;//相差的年数
         int xcMonth=m-1;

         //求相差年总天数
         for(i=0;i<xcYear;i++)
         {
                 if((2006+i)%4==0 && (2006+i)%100 !=0)
                 {
            DaysOfYear+=366;
                 }else if((2006+i)%400==0){
             DaysOfYear+=366;
                 }else
                 {
                         DaysOfYear+=365;
                 }
         }

        //求相差月总天数
         for(i=1;i<xcMonth;i++)
         {
                 if(y%4==0 && y%100 !=0)
                 {
            DaysOfMonth=leapYearMonths[i-1];
                 }else if(y%400==0)
                 {
             DaysOfMonth=leapYearMonths[i-1];
                 }else
                 {
                         DaysOfMonth=simpleYearMonths[i-1];
                 }
         }

    //总天数
         sumDays = DaysOfYear + DaysOfMonth + d;

         //判断那天认识的人
         if(sumDays %2 ==0){
                 printf("小明结识帅哥了\n");
         }else if(sumDays %3 == 0){
             printf("小明结识了美女\n");
         }else{
         printf("小明没有结识美女也没有结识帅哥\n");
         }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马