将句子中每个单词的第一个char转换为大写

时间:2016-01-21 22:04:14

标签: c arrays string char

我正在学习C,如果这个问题看似简单或新手,那么你就知道为什么了。在发布此问题之前,我已经在这里搜索了SO。似乎有很多它们但它们不是关于C,而是Java,php和其他。

我正在研究一个简单的程序,它必须转换每个单词大写的第一个字符。例如,如果输入是:

  

你好我的名字是克劳迪奥

输出将是

  

您好我的名字是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;

}

输出结果为:

  

MyNameIsClaudio

如上所述,显然这不是我所期待的。我以为我能够解决这个问题只需添加一个这样的空间:

token[strlen(token)+1] = ' ';
strcat(sentence2,token);

但同样,输出不是预期的输出:

  

MyAmeSLaudio

因此,为了达到预期的效果,我尝试了:

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

但这似乎都不是正确的方法。 目前我处于死胡同。有人可以告诉我如何完成我想要做的事情吗?

3 个答案:

答案 0 :(得分:3)

您只需在连接转换后的字符串后连接空格:

strcat(sentence2,token);
strcat(sentence2," ");

答案 1 :(得分: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';

答案 2 :(得分:0)

您可以添加此行以将空格放回

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