将句子中每个单词的首字母转换为大写

3
我目前正在学习C语言,如果这个问题看起来很简单或者是新手问题,那么你就知道原因了。在发布这个问题之前,我已经在SO上搜索过了。似乎有很多类似的问题,但它们不是关于C语言的,而是Java、php和其他语言。
我正在开发一个简单的程序,需要将每个单词的第一个字符转换为大写。例如,如果输入是:
hello my name is claudio
输出应该是:
Hello My Name Is Claudio
这是我目前编写的代码:
#include <stdio.h>
#include <string.h>

int main(void){

        char sentence[21] = {'\0'}, sentence2[21] = {'\0'}, *token = NULL;

        fgets(sentence,21,stdin);

        token = strtok(sentence," ");

        while(token != NULL)
        {
                *token = toupper(token[0]);
                strcat(sentence2,token);
                token = strtok(NULL," ");
        }

        puts(sentence2);

return 0;

}

输出结果如下:

我的名字是Claudio

显然这不是我预期的结果,正如上面所解释的那样。我曾认为只需添加一个空格即可解决问题,如下所示:
token[strlen(token)+1] = ' ';
strcat(sentence2,token);

但是,输出结果并不是预期的:

MyAmeSLaudio

因此,为了达到预期的结果,我尝试了以下方法:

null_char = strrchr(token,'\0');
*null_char = ' ';

但这似乎也不是正确的方法。目前我陷入了死局。有人能给我一些提示,告诉我如何完成我想做的事吗?


2
遍历 sentence[] 数组,并确保每个空格后的字母都是大写。 - chux - Reinstate Monica
1
char sentence[21] 对于样本输入来说有点小了。frase 打错成了 sentence - BLUEPIXY
@BLUEPIXY 修正了代码。感谢您找出了这个笔误。在一种语言中思考,用另一种语言写作和阅读,并寻找错误并不容易 :P - Claudio Cortese
3个回答

3
你只需要在连接转换后的字符串之后添加一个空格即可:
strcat(sentence2,token);
strcat(sentence2," ");

3

替代方案: 遍历数组

strtok()函数会丢失空格分隔符,而这种方法可以保留连续的空格。

遍历 sentence[] 数组,在每个空格后的字母上确保它是大写的。

fgets(sentence1, sizeof sentence1, stdin);

int precious_space = 1;
size_t len = strlen(sentence1);
for (size_t i = 0; i <= len; i++) {
  sentence2[i] = previous_space ? toupper((unsigned char) sentence1[i]) : sentence1[i];
  precious_space = sentence1[i] == ' ';
}  
fputs(sentence2, stdout);

替代性循环。请参见@l3x

size_t i
for (i = 0; sentence1[i]; i++) {
  sentence2[i] = previous_space ? toupper((unsigned char) sentence1[i]) : sentence1[i];
  precious_space = sentence1[i] == ' ';
}  
sentence2[i] = '\0';

1
strlen() 也不是必需的:for (size_t i = 0; sentence1[i]; i++) 也可以。 - P.P
你在说“strtok()失去了空格分隔符”是什么意思? 我找到的标记没有以空字符结尾? - Claudio Cortese
@l3x 真的差不多。如果代码使用了sentence1[i],则需要将一个空字符附加到sentence2。我认为这种方式对于提问者来说会更清晰。 - chux - Reinstate Monica
1
@Claudio Cortese:“我找到的token没有以空字符结尾” - strtok() 返回的 char * 要么是 NULL,要么是指向一个字符串的指针。根据定义,一个字符串总是以空字符结尾。 - chux - Reinstate Monica

0

你可以只需添加这一行来重新加入空格

    while(token != NULL)
    {
            *token = toupper(token[0]);
            strcat(sentence2,token);
            token = strtok(NULL," ");
            if (token)
              strcat(sentence2, " ");
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接