【问题标题】:C++ First letter of every word must be uppercasedC++ 每个单词的首字母必须大写
【发布时间】:2021-12-04 17:49:06
【问题描述】:

我是一名学生,刚接触编程

我正在尝试将每个单词的第一个字母大写,其余的小写。

当前的输出是即使我输入了 2 个或更多单词,也只打印了第一个单词。

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int i;
    char str[100];
    char rev;
    int len = 0;

    cout << "Enter a string: ";
    cin >> str;
    
    len = strlen(str);
    
    for (i = 0; i < len; i++)
    {
        if (i == 0)
        {
            str[i] = toupper(str[i]);
        }
        else
        {
            str[i] = tolower(str[i]);
        }
        cout << str[i];
    }
}

【问题讨论】:

  • 提示,读完后尝试打印 str 并验证你读过的内容。
  • 这并没有解决问题,但int len = 0; ... len = strlen(str); 应该是int len = strlen(str);。用无意义的值初始化对象并立即覆盖该值是没有意义的。只需将其初始化为您需要的值即可。

标签: c++ c++11 visual-c++ c++14


【解决方案1】:

请注意,您的代码仍然有更多的“c”风味,而不是“c++”风味。 仍然可以使用管理您自己的数组的大小和使用索引, 但最好留给标准库的类。因此,如果您想要一个字符串,请使用 std::string 而不是 char str[100];另请注意,字符串有一个长度方法,不需要将字符串转换为字符数组。 看看这个例子:

#include <string>
#include <set>
#include <iostream>

// do not teach yourself to type : using namespace std.
// just type std:: in front of every std type
// it will avoid problems in bigger projects later

// for anything you do make a function with a readable name.
// pass by value so we get a copy of the string to work on.
std::string capitalize(std::string string)
{
    // create a static set of unique characters that will
    // be used to recognize where new words begin.
    // I added a few, maybe more are needed. 
    static std::set<char> delimiters{ ' ', ',', '.', '\n' };

    // first character of a sentence should always be uppercase
    bool make_next_char_uppercase = true;

    // loop over all the characters in the input string.
    // this is called a range based for loop and is 
    // an improvement over the indexed for loop
    // used since "C", this style of loop can't go outside
    // the bounds of the array.
    // use a reference so we can modify the characters in place
    for (char& c : string)
    {
        if (make_next_char_uppercase) c = toupper(c);
        
        // the next line of code is C++20 syntax.
        // but it means that if you encounter a word delimiter
        // then the next character read must be changed to uppercase.
        make_next_char_uppercase = delimiters.contains(c);

        // for earlier versions of C++ use
        //make_next_char_uppercase = (std::find(delimiters.begin(), delimiters.end(), c) != delimiters.end());
    }

    return string;
}

int main()
{
    auto output = capitalize("the quick brown fox jumps over the lazy dog!\nalso text after a newline and a,should be uppercase!");
    std::cout << output;
}

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    {
    int i;
    char str[100];
    char rev;
    int len = 0;
    
    cout << "Enter a string: ";
    cin.getline(str, 100);
    
    len = strlen(str);
    
    for (i = 0; i < len; i++)
    {
        if (i == 0)
        {
            str[i] = toupper(str[i]);
        }
        if (str[i] == ' ')
        {
            str[i + 1] = toupper(str[i + 1]);
        }
        cout << str[i];
    }
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    std::cin 看到空格时停止阅读。如果您想读到换行符,请使用getline()。此外,与在 C++ 中一样,使用 std::string 而不是 C 样式的字符串。而且你不应该使用using namespace std;,因为它被认为是不好的做法,如here所示。

    我的“推荐”代码:

    #include <iostream>
    #include <string>
    #include <cctype>
    int main()
    {
        std::string str;
        char rev{};
    
        std::cout << "Enter a string: ";
        getline(std::cin, str);
    
        int len {str.size()};
    
        for (int i = 0; i < len; i++)
        {
            if (i == 0)
            {
                str[i] = toupper(str[i]);
            }
            if (str[i] == ' ')
            {
                str[i + 1] = toupper(str[i + 1]);
            }
            std::cout << str[i];
        }
    }
    

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,一旦std::cin 遇到空格,它将停止读取。

      下面的代码仍然一次读取 1 个单词。我喜欢它本质上是如何为您进行字符串拆分,而无需您付出太多努力。

      然后我使用iterator's 来遍历std::string 中的字符。

      需要skip 函数来删除stream 中的任何空格,以便我可以检查换行符(\n)。如果检测到换行符,则break 退出循环。

      static std::istream& skip( std::istream& stream ) 
      {
          static const std::set<char> needles{ ' ', '\t', '\r', '\v' };
          while ( needles.find( static_cast<char>( stream.peek( ) ) ) != needles.end( ) ) 
          {
              stream.ignore( );
          }
          return stream;
      }
      
      int main( ) 
      {
          const auto to_upper{ [ ]( auto begin, auto end ) { 
              std::transform( begin, end, begin, [ ]( unsigned char c ) { 
                  return std::toupper( c );
              } );
          } };
      
          const auto to_lower{ [ ]( auto begin, auto end ) { 
              std::transform( begin, end, begin, [ ]( unsigned char c ) { 
                  return std::tolower( c );
              } );
          } };
      
          std::cout << "Enter a strings\n";
      
          for( std::string input{ }; std::cin >> input; ) 
          {
              to_upper( input.begin( ), input.begin( ) + 1 );
              to_lower( input.begin( ) + 1, input.end( ) );
          
              std::cout << input << ' ';
              if ( std::cin >> skip && std::cin.peek( ) == '\n' ) 
              {
                  std::cout << '\n';
                  break;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-30
        • 2016-12-05
        • 2015-11-10
        • 2016-12-23
        • 2015-11-04
        • 2017-08-02
        • 2012-11-11
        • 1970-01-01
        • 2013-12-15
        相关资源
        最近更新 更多