如何解决如何遍历CString并将其字符与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”中看到:
我尝试过直接从类型为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"));
}
}
在您的情况下,输出看起来很奇怪的原因是您要传递一个指向 not 的字符的指针,后跟一个空终止符:
// 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
字符验证来严格解决您的特定问题。但是,如果您可以从更广阔的角度看一看,我肯定会考虑在将用户输入 存储在列表视图控件中之前,先进行 validation 验证。例如,您可以从列表视图控件中处理LVN_ENDLABELEDIT
notification,并拒绝无效的输入值。
或者,考虑到每个位的唯一有效值为0和1,则可以让用户从组合框中选择它们。
从MFC的CListCtrl
开始并不是一件容易的事。因此,您也可以考虑使用其他开放源代码控件,例如CGridListCtrlEx
control available from CodeProject。
在上一段中,“检查类型/*...*/
if (
sourceSheet
.getRange(firstWeek[l].offset(0,columnsPerWeek * k).getA1Notation())
.isBlank()
) {
unprotectRange.push(
firstWeek[l].offset(0,columnsPerWeek * k).getA1Notation()/*Modified*/
);
}
/*...*/
const ranges2 = unprotectRange.map(a1Notation => destinationSheet.getRange(a1Notation));
const protection = destinationSheet.protect().setDescription('Maintain');
protection.setUnprotectedRanges(ranges2);
protection.removeEditors(protection.getEditors())
的变量cvalue
中的字符是CString
还是'0'
?”
就是这样。 '1'
是字符0。但是您要检查整数'0'
,它等于字符0
。那是字符串的结尾字符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。