gpt4 book ai didi

c++ - 如何遍历CString并将其字符与int进行比较?

转载 作者:行者123 更新时间:2023-12-03 06:57:55 28 4
gpt4 key购买 nike

我正在C++中的Visual Studio 2017中编写基于对话框的MFC应用程序。在对话框中,我添加了一个列表控件,用户可以在其中更改单元格的值,如下图所示:
enter image description here
在他更改了值之后,我要检查这些值是否有效(因此,如果他不小心按下了错误的按钮,将会收到通知)。为此,我遍历列表的不同单元,并从每个单元中提取写入其中的文本到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”中看到:
enter image description here
我尝试过直接从 cvalue类型的 CString变量中提取字符,如下所示: cvalue[i]这是我使用的长度 strlen(cvalue[i])但我得到了相同的结果。我还尝试过访问 cvalue类型的 CString变量中的字符,如下所示: cvalue.GetAt(i)并通过使用以下命令获取其长度: cvalue.GetLength()但同样,我得到了相同的结果。
也许有人可以建议我如何检查 cvalue类型的 CString变量中的字符是“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数组,该数组存储要输出的字符,后跟null-终止符:
// This is an array storing two chars: value[i] followed by '\0' (null)
char s[2] = {value[i], '\0'};

MessageBox(s, "value");
P.S.
我在代码示例中使用了 TCHAR而不是 char,以使代码更易于移植到Unicode构建中。将 TCHAR视为预处理器宏,它映射到ANSI / MBCS构建的 char(这似乎是您当前的情况),映射到Unicode构建的 wchar_t

验证用户输入的简要说明
通过以上回答,我尝试使用 CString字符验证来严格解决您的特定问题。但是,如果您可以从更广阔的 Angular 看一下,我肯定会考虑先验证用户输入,然后再将其存储在列表 View 控件中。例如,您可以从列表 View 控件中处理 LVN_ENDLABELEDIT notification,并拒绝无效的输入值。
或者,考虑到每个位的唯一有效值为0和1,则可以让用户从 组合框中选择它们。
从MFC的 CListCtrl开始这样做并非易事。因此,您也可以考虑使用其他开源控件,例如 CGridListCtrlEx control available from CodeProject

关于c++ - 如何遍历CString并将其字符与int进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63780438/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com