[英]How can I iterate over CString and compare its characters to int?
我正在用 C++ 在 Visual Studio 2017 中編寫一個基於對話框的 MFC 應用程序。 在對話框中,我添加了一個列表控件,用戶可以在其中更改單元格的值,如下圖所示:
在他更改值后,我想檢查這些值是否有效(所以如果他不小心按錯了按鈕,他會收到通知)。 為此,我迭代列表的不同單元格,並從每個單元格中提取寫入其中的文本到CString
類型變量中。 我想檢查這個變量是否只有 8 個字符,它們是“1”或“0”。 我編寫的代碼的問題在於,當我嘗試打印CString
變量的不同字符時,我得到了奇怪的值。
檢查CString
有效性的代碼:
void CEditableListControlDlg::OnBnClickedButton4()
{
// TODO: Add your control notification handler code here
// Iterate over the different cells
int bit7Col = 2;
int bit6Col = 3;
int bit5Col = 4;
int bit4Col = 5;
int bit3Col = 6;
int bit2Col = 7;
int bit1Col = 8;
int bit0Col = 9;
for (int i = 0; i < m_EditableList.GetItemCount(); ++i) {
CString bit7 = m_EditableList.GetItemText(i, bit7Col);
CString bit6 = m_EditableList.GetItemText(i, bit6Col);
CString bit5 = m_EditableList.GetItemText(i, bit5Col);
CString bit4 = m_EditableList.GetItemText(i, bit4Col);
CString bit3 = m_EditableList.GetItemText(i, bit3Col);
CString bit2 = m_EditableList.GetItemText(i, bit2Col);
CString bit1 = m_EditableList.GetItemText(i, bit1Col);
CString bit0 = m_EditableList.GetItemText(i, bit0Col);
CString cvalue = bit7 + bit6 + bit5 + bit4 + bit3 + bit1 + bit0;
std::string value((LPCSTR)cvalue);
int length = value.length();
if (length != 7) {
MessageBox("Register Value Is Too Long", "Error");
return;
}
for (int i = 0; i < length; i++) {
if (value[i] != static_cast<char>(0) || value[i] != static_cast<char>(1)) {
char c = value[i];
MessageBox(&c, "value"); // this is where I try to print the value
return;
}
}
}
}
當我嘗試打印變量value
一個字符時,消息框中打印的內容的圖片。 我希望看到“1”,但我在消息框中看到“1iiiiii”:
我試過直接從CString
類型的變量cvalue
中提取字符,如下所示:
cvalue[i]
這是我通過使用得到的長度
strlen(cvalue[i])
但我得到了同樣的結果。 我還嘗試訪問CString
類型的變量cvalue
中的字符,如下所示:
cvalue.GetAt(i)
並使用以下方法獲取它的長度: cvalue.GetLength()
但同樣,我得到了相同的結果。
也許有人可以建議我如何檢查CString
類型的變量cvalue
中的字符是“0”還是“1”?
謝謝你。
在這種情況下,您不需要使用std::string
來處理您的字符串: CString
工作正常。
假設您的CString cvalue
是您要檢查的字符串,您可以編寫一個簡單的循環,如下所示:
// Check cvalue for characters different than '0' and '1'
for (int i = 0; i < cvalue.GetLength(); i++)
{
TCHAR currChar = cvalue.GetAt(i);
if ((currChar != _T('0')) && (currChar != _T('1')))
{
CString message;
message.Format(_T("Invalid character at position %d : %c"), i, currChar);
MessageBox(message, _T("Error"));
}
}
在您的案例中出現明顯奇怪的輸出的原因是您傳遞了一個指向后面沒有空終止符的字符的指針:
// Wrong code
char c = value[i];
MessageBox(&c, "value");
如果您不想使用包含違規字符的格式化消息構建CString
,就像我在前面的示例代碼中所做的那樣,另一種方法是創建一個簡單的原始char
數組,存儲要輸出的字符,后跟空字符-終結者:
// This is an array storing two chars: value[i] followed by '\0' (null)
char s[2] = {value[i], '\0'};
MessageBox(s, "value");
PS我在我的代碼示例中使用了TCHAR
而不是char
,以使代碼更容易移植到 Unicode 版本。 將TCHAR
視為預處理器宏,它映射到 ANSI/MBCS 構建的char
(這似乎是您當前的情況),以及映射到 Unicode 構建的wchar_t
。
有了上面的答案,我試圖通過CString
字符驗證來嚴格解決您的具體問題。 但是,如果您可以從更廣泛的角度來看一看,我肯定會考慮在將用戶輸入存儲到列表視圖控件之前對其進行驗證。 例如,您可以處理來自列表視圖控件的LVN_ENDLABELEDIT
通知,並拒絕無效的輸入值。
或者,考慮到每個位的唯一有效值是 0 和 1,您可以讓用戶從組合框中選擇它們。
從 MFC 的CListCtrl
開始執行此操作是一項非常重要的工作; 因此,您還可以考慮使用其他開源控件,例如CGridListCtrlEx
提供的CGridListCtrlEx
控件。
正如您在最后一段中所寫,“檢查CString
類型的變量cvalue
中的字符是'0'
還是'1'
?”。
正是如此。 '0'
是字符 0。但是您檢查整數0
,它等於字符'\\0'
。 那是字符串的結尾字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.