簡體   English   中英

c ++計算用戶輸入的文本行中小寫字母的數量

[英]c++ counting number of lowercase letters in a user inputted line of text

我只做了3個月,目前仍處於停滯狀態。 我不確定自己在做什么錯。 我會很高興為我指明正確的方向。 我不是要別人替我做作業。 我應該編寫一個程序以接受用戶輸入的一行內容,然后計算並輸出小寫字母的數量。 到目前為止,這就是我所擁有的,但是它沒有完成應做的事情。

#include <fstream>
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main(){
    char text;
    int count = 0;
    cout << " Enter one line of text: ";

    do 
    {
        cin.get(text);

        while(text!='\n')
        {
            if(islower(text))
            count++;
        }
    } while(text!='\n');

    cout << count << "\n";
}

問題出在輸入:您輸入了不同的字符,但是空白將被跳過。

您可以使用std::getline一次獲取一行輸入:

#include <algorithm>
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main()
{
    cout << " Enter one line of text: ";
    string s;
    if(getline(cin, s))
    {
        size_t count = count_if(s.begin(), s.end(), 
               [](unsigned char ch) { return islower(ch); });
        cout << count << "\n";
    }
}

您創建一個無限循環:

while (text != '\n') {
    ...
}

如果text (某種字符的誤稱)與'\\ n'有所不同,它將永遠持續下去。 作為一般准則,每當創建一個循環時,都需要驗證該循環的主體在某種程度上朝着該循環的終點取得了進展,並且已經達到了該循環的終點(當然,除非您打算創建一個無限大的循環)。 lop)您可能只想while (...)擺脫這種情況while (...)然后保持身體。

請注意,外循環應具有兩個條件才能終止:

  1. 如果到達行尾,它將終止。
  2. 如果到達輸入的末尾,它應該終止:這不一定由換行符終止。

如果要編寫循環,它將類似於以下內容:

for (std::istreambuf_iterator<char> it(std::cin), end; it != end && *it != '\n'; ++it) {
    // do something with the `char` obtained from `*it`
}

還值得注意的是,您需要確保將正值傳遞給islower() (或<cctype>任何其他函數):在某些系統中, char被簽名,例如,以我的名字命名的ü將轉換為負值,從而在調用islower('ü')時導致未定義的行為。 避免此問題的方法是將char轉換為unsigned char然后再將其傳遞給<cctype>函數: static_cast<unsigned char>(c)的位模式與c的位模式相同(假定c為類型char )。

堅持使用while循環讀取char的原始方法,基本循環看起來像這樣:

while (std::cin.get(text) && text != '\n') {
    if (std::islower(std::static_cast<unsigned char>(text))) {
        ++count;
    }
}

總的來說,我發現do ... while -loops很少不能幸存到生產代碼中,這也不例外:您僅想在可以成功讀取char情況下進入循環。 由於換行符不是小寫字母,因此也可以直接將其置於條件中。 對於ASCII字符std::islower(text)可以工作,但為了使代碼更牢固,我在unsigned char添加了unsigned char轉換以確保事情不會中斷。 最后,具有諷刺意味的是,用於遞增變量的C ++習慣用法是預先遞增,即++count而不是count++ 主要用途是,如果預遞增的類型並非完全無關緊要,則預遞增效率更高。 由於C ++使用大量遞增的迭代器,因此通常使用預遞增。

暫無
暫無

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

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