簡體   English   中英

C++ - 將給定字符串中每個單詞的第一個字符大寫

[英]C++ - Capitalize the first Character for each word in the given string

我有一個字符指針,然后我將它轉換為字符串格式。 所以我想把這個字符串中每個單詞的第一個字符大寫,我寫了下面的代碼:

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;
void transform(char *s);
int main(int argc, char const *argv[])
{
    char *str = new char[255];
    strcpy(str, "jimmy catter");
    string s;
    s+=str; //convert char to string
    std::cout<<s<<endl;
    for (int i = 0; i < s.length(); ++i)
    {
        if (s[i] == ' ')
        {
            if (islower(s[i+1])==1)
            {
                s[i+1] = toupper(s[i+1]);
            }       
        }

    }
    std::cout<<s<<endl; 
    return 0;
}

我希望輸出應該是 "Jimmy Catter" ,但我得到的結果仍然是較低的格式。 你能幫忙看看嗎?

所以基本上,這里有兩件事:

  1. islower()應該被視為它返回一個bool ,即使它說它返回一個int 這是因為對於一個bool ,實際值是false ,如果0和true ,如果不為0的,這意味着如果你想還是比較數值,你會說的任何值islower(s[i]) != 0 ,因為1 不是true的唯一有效內部值。
  2. 對於第一個字符 (J),它之前沒有空格。 所以,我們可以做的是檢查當前字符是第一個字符還是前一個字符是空格。 基本上,我們不是檢查當前字符並更改下一個字符,而是檢查前一個字符(或者它是否是第一個字符),然后更改當前字符。
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;
void transform(char *s);
int main(int argc, char const *argv[])
{
    char *str = new char[255];
    strcpy(str, "jimmy catter");
    string s;
    s+=str; //convert char to string
    std::cout<<s<<endl;
    for (int i = 0; i < s.length(); ++i) {
        if (i == 0 || s[i - 1] == ' ') {
            if (islower(s[i])) {
                s[i] = toupper(s[i]);
            }       
        }

    }
    std::cout<<s<<endl; 
    return 0;
}
  1. 這里要注意的第一件事是,如果參數是小寫而不是 1,則islower返回非零(> 0)數字。

  2. 其次,您試圖通過檢查 char 之前是否為whitespace來大寫 char 。 這種方法沒有錯,但它不適用於第一個字符,因此您可以通過在循環之前添加額外的行來實現。 因此,通過一些調整,它現在可以正常工作:

     #include <iostream> #include <cstring> #include <stdlib.h> #include <time.h> #include <string> using namespace std; // void transform(char *s); int main(int argc, char const *argv[]) { string s = "jimmy catter "; /* char *str = new char[255]; strcpy(str, "jimmy catter"); string s; s+=str; //convert char to string */ std::cout<<s<<endl; s[0]=toupper(s[0]); for (int i = 0; i < s.length()-1; ++i) { if (s[i] == ' ') { if (islower(s[i+1])>=1) { s[i+1] = toupper(s[i+1]); } } } std::cout<<s<<endl; return 0; }

您可以使用 ASCII 符號,因為它們在此類程序中很容易理解和執行。 我在循環部分稍微修改了你的代碼,它給出了正確的輸出。 看看它。

for (int i = 0; i < s.length(); ++i)
{
        if(!i&&97<=s[i]<=122)           //handles border condition where first letter is small case
        {
            s[i] = s[i]-32;
    }
    
     if ((i!=s.length-1)&&s[i] == ' ')  //prevents invalid output where last character is a space   
     {
          if (97<=s[i+1]<=122)      //checks if letter after space is small case
          {
            s[i+1] = s[i+1]-32;
          }       
     }

}
std::cout<<s<<endl; 
return 0;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM