- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在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"));
}
}
在您的情况下,输出看起来很奇怪的原因是,您正在传递一个指向不带空终止符的字符的指针:
// 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,并拒绝无效的输入值。
CListCtrl
开始这样做并非易事。因此,您也可以考虑使用其他开源控件,例如
CGridListCtrlEx
control available from CodeProject。
关于c++ - 如何遍历CString并将其字符与int进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63780438/
给定 CString buffer = ""; Cstring value = "blah"; buffer.Format ("%s %s", value, value.GetBuffer()); 这
我有这个函数可以将事件(每个事件都是一个 cstring)添加到事件数组中: bool vendor::addEvent(const char * event) { if (eventsSiz
我可以在 CString::Format 中使用 CString 吗,如下所示: CString text = _T("text"); CString format; format.Format(_T
我正在 Ubuntu 16.04 上使用 ROS 和 C++ 开展一个小组项目。一切正常,直到两周前我收到此错误突然的消息: In file included from /usr/include/c+
我有一个将 CString 作为参数之一的函数,我查看了代码库,发现很多地方都使用 const CString& 作为参数。 所以我想知道使用 CString 与 const CString& 之间是
我有两个列表和一个名字要查找。如果要查找的名称不在第一个列表中,那么它可能在格式略有不同的第二个列表中。给出了两种格式之间的转换函数。 std::map* convertedNames; BOOL C
我需要为我的对象计算签名(一种哈希)。计算需要许多每个字符的操作,因此为了加快此过程,我的代码对 CString 进行操作,然后将计算的 CString 转换为最终的 NSString。 stub 代
PVS 工作室发现了一个我正在调查的潜在缺陷;警告 V623 http://www.viva64.com/en/d/0240/ 但是,没有足够的解释来理解为什么要制作临时拷贝。如果 CString::
假设我有以下字符串 char array[1000]; 我如何将它转换为 NSString,反之亦然。 谢谢。 最佳答案 Apple 的开发者引用有一个 good article关于这个问题。基本上,
一些简单的代码在我一直使用的 sdk 中开始出现故障,而且它显然已经正常工作了很长时间,事实上我几乎可以肯定我已经编译了部分代码并且他们有工作,但最近失败了。 在调试器中确认值的示例: void So
我正在尝试这样做: #include CHAR Filename; // [sp+26Ch] [bp-110h]@1 char v31; // [sp+36Ch] [bp-10h]@1 int v3
我知道字符数组不同于 cstring,因为在 cstring 中包含后缀\0 标记值。然而,我也明白,在 cstring、字符数组或任何其他类型的数组的情况下,程序中的数组标识符是指向数组的指针。所以
我在将 unsigned char 转换为 CString 以及将转换后的 CString 结果转换为 unsigned char 时遇到问题。 首先,我尝试使用 CString.append();。
我正在使用一个 Windows 应用程序来解析某些二进制文件。应用程序每次在某个位置都会崩溃(读取访问冲突)。 我正在尝试找出崩溃的根本原因。 (f74.fac): Access violation
需要使用下面的 LogMethod() 来记录 buf 的内容问题是LogMethos 只接受“Const CString&” char buf[1024]; strcpy(buf, cErrorMs
假设我有一个文件。我将所有字节读入一个无符号字符缓冲区。从那里我试图在不知道它的长度的情况下读取一个 c 字符串(空终止)。 我尝试了以下方法: char* Stream::ReadCString()
我在使用数组时遇到问题。我收到以下错误 In function ‘int main(int, const char**)’: 75: error: cannot convert ‘char*’ to
我一直在尝试执行从包含十六进制字符串的 CString 到字节数组的转换,并且一直在 至今未成功。我查看了论坛,到目前为止似乎都没有帮助。有没有一个功能只有几个 执行此转换的代码行数? 我的代码: B
我有两个 CString s1 和 CString s2。我需要在 s1 中找到最后一个条目 s2。我可以在 CString 中找到任何方法,就像在 C# LastIndexOf 中一样。我在 C++
我想将丰富的编辑控件中的整个文本作为 CString 获取,例如 GetDlgItemText,但这是针对对话框的。我能从我的研究中找到的最接近的东西是: GetTextRange并使用 GetTex
我是一名优秀的程序员,十分优秀!