![](/img/trans.png)
[英]getline error in C++ code to swap uppercase to lowercase and vice-versa of a user inputted string
[英]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 (...)
然后保持身體。
請注意,外循環應具有兩個條件才能終止:
如果要編寫循環,它將類似於以下內容:
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.