首页 > 解决方案 > 我怎样才能得到单词的第一个元素并将其转换为大写字母,而其他所有字母都转换为小写字母?

问题描述

我编写了一个程序,它可以反转数组中的每个单词,但我的问题是我想要一个单词的第一个字母大写,其他所有字母小写。

C

#include <stdio.h>
#include<stdlib.h>
#include<ctype.h>

char * reversePrint( char *name )
{
    char *input_string = name;
    char temp;

    while (*input_string)
    {
        char *t = input_string;
        /* End of non Whitespace sequence */
        while (*t && *t == (unsigned char)*t && !isspace(*t))
        {
            t++;
        }
        if (t - input_string > 1)
        {
             /* Non whitespace Sequence  >1*/
            char *e = t;

            /* Reverse Words */
            do
            {
char temp = *input_string;

                *input_string++ = *--e;
                *e = temp;
            } 
        while (input_string < e);

//Paste reversed Sequence
            input_string = t;
        }
        else
        {
            //Non whitepace skip
            input_string++;
        }
    }

    return name;
}

int main( void ) 
{
    char s[] = "I love Pizza";

    printf("%s", reversePrint(s));

    return 0;
}

所以我的问题是我得到的结果是我 Evol azziP 但我必须有我 evol Azzip

谁能帮我吗?

标签: carrayscharreversec-strings

解决方案


您可以使用以下内容:

  • 使单词的所有第一个字符都大写。
  • 使所有其他小写

我已经使代码冗长,以便您更容易理解发生了什么。它可以重构为更紧凑的代码。

    void make_upper(char* line)
    {
        bool first = true;
        while(*line)
        {
            if(*line != ' ' && !first)
            {
                *line = tolower(*line);
            }
            //non first char of a word
            if(*line != ' ' && first)
            {
                *line = toupper(*line);
                first = false;
            }
            //new word ahead       
            if(*line == ' ')
                first = true;
            line++;        
        }    
    }

其中产生:Nomis Tbeil !azzip

现场演示


附带说明一下,反向打印功能非常难以阅读。不要编写冗长而复杂的函数,而是编写小型且可重用的函数,并通过将这些小块一起使用来构建复杂的功能。

您能想象一家汽车制造商一次性组装所有机器部件吗?你能想象在组装底盘的地方组装活塞或电子设备吗?将是一个巨大的混乱。发动机是单独组装的,只有在完成后才能与汽车的其余部分组装在一起。对软件做同样的事情。


推荐阅读