黑马程序员技术交流社区

标题: 输入一英文句子,将其中所有单词首字符转换成大写后输出。 [打印本页]

作者: cg287305691    时间: 2015-3-31 18:21
标题: 输入一英文句子,将其中所有单词首字符转换成大写后输出。
我不知道 哪儿错呢 求大神指点 不胜感激
  1. #include <stdio.h>
  2. #include <string.h>

  3. // 定义一个宏来代替字符数组的长度,便于修改
  4. #define N 90

  5. int main()
  6. {
  7.    // 提示用户输入一个英文句子
  8.     printf("请输入一个英文句子:\n");

  9.     // 定义一个字符数组用来接收字符串
  10.     char strArray[N];
  11.    
  12.     // 定义一个指针变量,并指向strArray的首字母
  13.     char *p = strArray;
  14.    
  15.     // 接收用户输入
  16.     scanf("%s",strArray);
  17.    
  18.       // 判断首字母是否为小写
  19.     if (strArray[0]>'a' && strArray[0]<'z') {
  20.         *p -= 32;
  21.     }
  22.    
  23.    
  24.     // printf("%ld",strlen(strArray));
  25.    
  26.     // 判断*p指针没有指向字符串末尾,并在循环中进行首字母转换
  27.     while (*p !='\0') {
  28.         
  29.         // 判断当前*p指针指向不为空格
  30.         if (*p != 32) {
  31.             p++;
  32.             
  33.         }else if (*p == 32){
  34.             p++;
  35.             if (*p >= 97 && *p <= 122) {
  36.                 *p -= 32;
  37.             }

  38.         }
  39.     }
  40.    
  41.     printf("%s\n",strArray);

  42.     return 0;
复制代码

作者: moresurui0308    时间: 2015-3-31 18:46
这样用scanf貌似接受不了句子,遇到空格就停止了
作者: cg287305691    时间: 2015-3-31 19:01
scanf()是遇到空格结束了,但基础视频就学了这个,怎么办呢
作者: cg287305691    时间: 2015-3-31 19:25
我网上查了下,要用gets()函数才能输入字符串,且遇到空格不会结束
作者: kenloo    时间: 2015-4-1 19:41
#include <stdio.h>

int main()

{
    char x[100];//定义一个数组接收字符串
    int i;
    printf("请输入英文句子\n");// 要求用户输入句子,并接收
    fgets(x,   sizeof(x),   stdin);
    x[0]=x[0]-32;
    for (i=1;x[i]!='\0';i++)
    {
        if (x[i-1]==' ')//如果一个字母前面有空格
        
        {
           x[i]=x[i]-32;//则将该字母改为大写
        }
    }
    for (i=0;x[i]!='\0';i++)
    {
        printf("%c",x[i]);
    }
    printf("\n");
}
作者: 13673696542    时间: 2015-4-1 20:23
我遇到这道题的时候刚开始和你一样用的sanf(),后来在网上查了查才知道应该用gets().
作者: Fire_day    时间: 2015-4-4 11:15
gets获取一行数据包括末尾的回车都获取。  所以输入一行数据,然后回车结束,系统就默认这一行数据都是输入,除开末尾的回车字符。
作者: 龙兄    时间: 2015-4-4 14:53
把那个 scanf("%s",strArray);换成gets(strArry);就行了。
作者: xiaoxiong    时间: 2015-4-4 15:53
scanf改成用gets的
作者:  常洋洋    时间: 2015-4-4 16:13
我想问一下这个代码怎么写到论坛呢?
作者: malcold    时间: 2015-4-4 17:15
用gets()试试
作者: sillypony    时间: 2015-4-4 19:19
由于存在潜在的缓冲区溢出问题,gets()已在C99下废弃,在C11下停用,如需读入整个字符串,应使用fgets()。
另一种简便的解决方法是用getchar()逐字符读入,处理后用putchar()直接输出。
  1. #include <stdio.h>

  2. #define INWORD 1        // Inside a word
  3. #define OUTWORD 0       // Outside a word

  4. char upper( char letter );

  5. int main( void ) {

  6.     char c;
  7.    
  8.     int state = OUTWORD;
  9.    
  10.     printf("Type in your input:\n");
  11.     while( (c=getchar()) != '\n' && c != EOF ) {
  12.    
  13.         // check for first letter of word
  14.         if( state == OUTWORD ) {
  15.             
  16.             // going into a word
  17.             if( !(c == ' ' || c == '\t') ) {
  18.                
  19.                 putchar( upper(c) );
  20.                 state = INWORD;
  21.                 continue;
  22.             }
  23.         }else if ( state == INWORD ) {
  24.             
  25.             // getting out of a word
  26.             if( c == ' ' || c == '\t' ) {
  27.                
  28.                 state = OUTWORD;
  29.             }
  30.         }else {
  31.             
  32.             // Error
  33.             return 1;
  34.         }
  35.         
  36.         // printf("%c", c);
  37.         putchar(c);
  38.     }
  39.    
  40.    
  41.     return 0;
  42. }

  43. /* Return capitalized letter. */
  44. char upper( char letter ) {
  45.    
  46.     // if is a lower case letter
  47.     if( letter>='a' && letter<='z' ) {
  48.    
  49.         return letter+'A'-'a';
  50.     }else {
  51.         
  52.         return letter;
  53.     }
  54. }
复制代码




作者: 游戏龙    时间: 2015-4-4 19:30
同学习了

作者: 流风124    时间: 2015-4-4 21:04
本帖最后由 流风124 于 2015-4-4 21:10 编辑

我也有这道题,用gets()函数我的代码
#include <stdio.h>
#include <stdlib.h>
#define M 200
//转成大写函数的声明
void Upper(char *in);

int main(int argc, const char * argv[])
{
    printf("第8题开始:\n");
    char input[M] = {'\0'};
    printf("请输入英文句子:\n");
    //gets()函数会报warning,但是这里要接收空格,所以还是使用了
    gets(input);
    //调用函数找到单词的首字符,并且将其转换成大写
    Upper(input);
    printf("第8题结束\n");
    return 0;
}

//函数:首字符转换成大写
void Upper(char in[])
{
    //判定是否是单词首字母的标志
    int flag = 1;
    int i = 0;
    while (in)
    {
        //当遇到空格和Tab键时,下1个字母即为首字母
        if (in == ' ' || in == '\t')
        {
            flag = 1;
        }else if (flag == 1)
        {
            //将首字母的小写转换成大写
            if (in >= 'a' && in <= 'z')
            {
                in = in - ('a' - 'A');
            }
            flag = 0;
        }
        i++;
    }
    printf("%s\n",in);
}

作者: qiuyuhuaihua    时间: 2015-4-4 22:49
我就说一句,绝对能解决你的问题:
将你的scanf("%s", strArray) 换成 scanf("%[^\n]", strArray];就OK了  我的基础测试也是这个题,所以不会坑你的。 至于scanf("%[^\n]"是啥意思,你可以百度~~
作者: super~bin    时间: 2015-4-6 10:31
cg287305691 发表于 2015-3-31 19:01
scanf()是遇到空格结束了,但基础视频就学了这个,怎么办呢

scanf可以的,用%[^/n]就行,百度百科上有
作者: 天天是我呀    时间: 2015-4-6 17:28
共同学习了
作者: qingying5810    时间: 2015-4-13 17:58
感谢亲 给我点评赠我黑马币 祝你在黑马学业有成 希望能成为同学 你是先付费还是后付?

作者: 谷飞飞    时间: 2015-4-13 20:49
好详细,学习到了




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