【问题标题】:Transforming the first char of every word in a sentence to uppercase将句子中每个单词的第一个字符转换为大写
【发布时间】:2016-01-21 22:04:14
【问题描述】:

我目前正在学习 C,如果这个问题看起来很简单或新手,那么你知道为什么。另外,在发布此问题之前,我已经在 SO 上进行了搜索。好像有很多,但不是C,而是Java、php等。

我正在开发一个简单的程序,该程序必须将每个单词的第一个字符转换为大写。例如,如果输入是:

你好,我叫克劳迪奥

输出将是

你好,我叫克劳迪奥

这是我到目前为止的代码:

#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;

}

输出是:

我的名字是克劳迪奥

显然这不是我所期望的,如上所述。我认为我可以通过添加这样的空格来解决问题:

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

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

MyAmeSLaudio

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

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

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

【问题讨论】:

  • 遍历sentence[] 数组,并且对于空格后的每个字母,确保它是大写的。
  • char sentence[21] 对于样本输入来说很小。 frase 错字为sentence
  • @BLUEPIXY 固定代码。感谢您找出错字。用一种语言思考不容易,用另一种语言书写和阅读并寻找错误:P

标签: c arrays string char


【解决方案1】:

你只需要在连接转换后的字符串后连接一个空格:

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

【讨论】:

    【解决方案2】:

    替代方案:遍历数组

    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';
    

    【讨论】:

    • strlen() 也不需要:for (size_t i = 0; sentence1[i]; i++) 也可以。
    • “strtok() 丢失空格分隔符”是什么意思?我找到的令牌不是空终止的?
    • @l3x 是的——几乎。如果代码使用sentence1[i],则需要将空字符附加到sentence2。认为这种方式对 OP 来说会更清晰。
    • @Claudio Cortese "我发现的令牌不是空终止的" -- strtok() 返回的 char *NULL 或指向 string的指针>。根据定义,字符串总是以空字符结尾。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2021-01-13
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多