【问题标题】:C first letter to uppercase ignores first wordC 第一个字母转大写忽略第一个单词
【发布时间】:2015-11-30 12:31:14
【问题描述】:

我试图使每个第一个单词的字母大写,但它忽略了第一个单词并跳到第二个。 “apple macbook”应该是“Apple Macbook”,但它给了我“apple Macbook”。如果我在 for 循环之前添加 printf(" %c", toupper(string[0])); 并在 for 循环中更改 p=1 它会给我正确的结果,但如果字符串以空格开头,那么它将失败。 这是代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
    char string[] = "apple macbook";
    int p;
    for(p = 0; p<strlen(string); p++)
    {
        if(string[p] == ' ')
        {
            printf(" %c", toupper(string[p+1]));
            p++;
        }
        else
        {
            printf("%c", string[p]);
        }
    }
    return 0;
}

【问题讨论】:

  • 显然代码不起作用,因为字符串中的第一个字母是特殊情况,前面没有空格。您必须单独处理这种特殊情况。另外,你需要从0迭代到strlen(string)-1,否则你的程序总是会破坏空终止符,然后当空格是字符串的最后一个字母时崩溃。
  • 你感到惊讶吗? “Apple”之前没有空格。
  • 您在 if 语句中测试空格字符。下一个字符将转换为大写。试试if (p==0 || string[p] == ' ')

标签: c string whitespace toupper


【解决方案1】:

一个简单的解决方法如下:

 for(p = 0; p<strlen(string); p++)
    {
        if(p == 0 || string[p - 1] == ' ')
        {
            printf("%c", toupper(string[p]));
        }
        else
        {
            printf("%c", string[p]);
        }
    }

【讨论】:

  • @gsamaras:你说好像更改输入字符串是个好主意...:-)
  • 嗯 @MOehm 你是对的,我会更新我的问题!
  • @xxxvodnikxxx 如果 p 为零,则不会进入下一个条件,即string[p - 1] == ' '
  • @xxxvodnikxxx:C 的短路求值保证当左表达式为真时,逻辑或|| 的右表达式不求值,这意味着整个表达式必须为真。
  • @xxxvodnikxxx:甚至没有可能。这是有保证的,很多代码都依赖它。
【解决方案2】:

改变这个:

char string[] = "apple macbook";

到这里:

char string[] = " apple macbook";

你会得到你想要的。

原因是在你的循环中,你搜索了一个空格来更改字母。


但是,niyasc 的答案更好,因为它不会改变输入字符串,而是改变程序的逻辑。

我这样做主要是为了利用你遇到的行为的原因,所以你被敦促自己改变你的逻辑。 :)

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2020-10-06
    • 2014-04-11
    相关资源
    最近更新 更多