我目前正在學習 C ,為此我正在閱讀“C Primer”一書。到目前為止,這本書非常好,我學到了很多東西,但是我在使用向量時遇到了奇怪的行為,我不確定這是否正確,或者這是否是我的問題。
任務是:
從中讀取一系列單詞
cin并存盤值 avector。閱讀完所有單詞后,處理vector并將每個單詞更改為大寫。列印轉換后的元素,一行八個字。”
這是我的代碼:
#include <iostream>
#include <vector>
using namespace::std;
int main()
{
string input;
vector<string> svec;
while (cin >> input)
{
svec.push_back(input);
for (auto& rows : svec)
{
for (auto& element : rows)
{
element = toupper(element);
}
}
int maxWordsPerLine = 0;
for (auto word : svec)
{
if (maxWordsPerLine >= 8)
{
cout << endl;
cout << word;
maxWordsPerLine = 1;
}
else
{
cout << word;
maxWordsPerLine ;
}
}
}
}
我相信它會完成任務中描述的事情,但是當我輸入時:
Hello thanks for helping I dont know whats wrong with this problem lol
輸出是:
HELLOHELLOTHANKSHELLOTHANKSFORHELLOTHANKSFORHELPINGHELLOTHANKSFORHELPINGIHELLOTHANKSFORHELPINGIDONTHELLOTHANKSFORHELPINGIDONTKNOWHELLOTHANKSFORHELPINGIDONTKNOWWHATSHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISPROBLEMHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISPROBLEMLOL
我希望有人能解釋我為什么會發生這種情況以及我將來如何避免它。
uj5u.com熱心網友回復:
你需要意識到有兩個步驟。
第一步:閱讀所有單詞并將每個單詞轉換為大寫
第二步:列印所有單詞
第一步完成后需要進行第二步。但是,您只有一個while回圈。沒有運行它,但看起來可能有效的最簡單的更改是:
string input;
vector<string> svec;
while (cin >> input)
{
svec.push_back(input);
for (auto& rows : svec)
{
for (auto& element : rows)
{
element = toupper(element);
}
}
} // extra closing bracket for the while
int maxWordsPerLine = 0;
for (auto word : svec)
{
if (maxWordsPerLine >= 8)
{
cout << endl;
cout << word << " "; // extra space to separate words
maxWordsPerLine = 1;
}
else
{
cout << word;
maxWordsPerLine ;
}
}
uj5u.com熱心網友回復:
對于初學者,您需要包含標題 <string>
#include <string>
在這個while回圈中
while (cin >> input)
{
svec.push_back(input);
for (auto& rows : svec)
{
for (auto& element : rows)
{
element = toupper(element);
}
}
//...
您正在將給定迭代中所有輸入的單詞一次又一次地轉換為大寫。
并且必須從 while 回圈中洗掉輸出向量。
所以while回圈可以如下所示
while ( cin >> input )
{
svec.push_back(input);
for ( auto& element : svec.back() )
{
element = toupper(element);
}
}
之后,您可以輸出向量。
并在這個范圍內基于 for 回圈
for (auto word : svec)
您不應創建存盤在向量中的字串的副本。您應該將變數宣告word為具有常量參考型別
for ( const auto &word : svec)
此外,內部 if 陳述句具有重復的代碼,這不是一種好的編程風格。
if (maxWordsPerLine >= 8)
{
cout << endl;
cout << word;
maxWordsPerLine = 1;
}
else
{
cout << word;
maxWordsPerLine ;
}
在基于for回圈的范圍內重寫if陳述句,例如以下方式
cout << word << ' ';
if ( maxWordsPerLine == 8)
{
cout << endl;
maxWordsPerLine = 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362955.html
