我正在開發一個具有注冊系統的程式,您可以在其中注冊新成員。
為了提供一些背景關系,您注冊的名稱必須與現有名稱不同,只能是一個單詞,并且在保存到檔案之前變成全部大寫。為了避免檔案處理中的潛在錯誤,我只希望用戶名是字母,沒有數字或特殊字符。
因為我想避免用戶可能意外輸入的前導和尾隨空格,所以我決定將注冊的新用戶名存盤到 char 陣列newName中,但我只是不知道如何正確地通過 char 陣列來檢查任何數字或特殊字符,以便我可以要求用戶輸入正確的用戶名。我嘗試過使用不同的回圈變體和isalpha()函式,但還沒有找到任何東西。
這是我的代碼的那部分,到目前為止,"sorry, wrong username"無論我輸入帶有數字/特殊字符還是僅字母的用戶名,它都只說明:
char newName[80];
bool valid;
do {
valid = true;
std::cin >> newName;
std::cin.sync();
for (int i = 0; i < 80; i ) {
if (!std::isalpha(newName[i]))
valid = false;
else
valid = true;
}
if (!valid)
std::cout << "Sorry, wrong username." << std::endl;
} while (!valid);
for (int i = 0; i < 80; i ) {
if (newName[i] != '\0')
newName[i] = toupper(newName[i]);
else
break;
}
for (int i = 0; i < nameList.size(); i ) {
if (nameList.at(i) == newName) {
std::cout << "Sorry, this name already exists. If you are registering a new member, please enter a new name for them." << std::endl;
validName = false;
break;
}
if (nameList.at(i) != newName)
validName = true;
}
uj5u.com熱心網友回復:
主要問題是您char[]對字串使用 C 樣式。在 C 中,我們使用std::string字串的資料型別。std::string與樣式字串相比,它的優勢是什么,很難理解,為什么有人仍然想使用舊的東西。
結果,您遇到了現在面臨的問題。您正在使用魔術常數 80 來定義 char 陣列。您還在回圈中使用硬編碼的數字 80,因此如果您在一個地方更改 80,您可能會在其他地方忘記它。并遇到麻煩。
然后,接下來,這就是您的問題的根本原因,如果您輸入的名稱少于 80 個字符,將會發生什么。
示例:您輸入“邁克”。這是 4 個字母和一個尾隨 0。所以,總共 5 個字符。在這 5 個字母之后,這 5 個相關字母之后的剩余陣列位置將出現隨機垃圾。
但是您的回圈始終運行到 80。因此,在檢查了前幾個正確字符之后,您將繼續檢查垃圾。然后你在你的第一個回圈中得到隨機結果。
如果你想解決這個問題,那么你還應該使用 C-Stylestrlen函式來獲取字串的長度。然后你應該回圈到這個值。
就像是:
int length = strlen(newName);
for (int i = 0; (i < length) and (i < 80); i ) {
這將解決您的問題。
但再次建議:請考慮使用 std::string
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/413565.html
標籤:
下一篇:加密時檔案末尾出現奇怪字符
