我正在尝试使用 atoi() 将 LPCSTR 转换为整数,并验证转换是否成功我想计算它产生的整数和原始 LPCSTR 中的位数(它应该只包含整数)
我很难找到一种计算 LPCSTR 长度的好方法。到目前为止,唯一的方法似乎只是计数,直到我得到一个'/0'
对更好的方法有什么建议吗?
谢谢
要查找 的长度(在本例中为位数)LPCTSTR
,您应该使用lstrlen()
而不是strlen()
。资料来源:MSDN
这不是 strlen 所做的吗?
您可以使用strtol
并使用endptr
返回来检查它是否是字符串的结尾(0 字节)。
计数不一定准确。"00" 将产生 0,但 0 有一位,原始字符串的长度为 2。
没有。
这就是你如何找到一个 c 字符串的长度。您可以使用strlen
,但它仍然必须遍历整个字符串并计算 a 之前的字符数'\0'
。
谈论产生比光更多的热量...... :) 停止使用'atoi',这将解决你的大部分问题。'atoi' 是一个死函数,没有实用价值。将字符串表示形式转换为数字的正确方法是来自“strto...”组(“strtol”、“strtoul”等)的函数。这些函数将向您返回足够的信息,以便立即确定是否发生了转换错误。
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
我会做一些不同的事情——用输入初始化一个字符串流,读取一个 int,然后检查流是否为空:
#include <sstream>
#include <iostream>
typedef char const *LPCSTR;
template <class T>
bool check_read(LPCSTR input, T &val) {
std::istringstream reader(input);
reader >> val;
char ch;
if (reader >> ch) {
std::cerr << "\nUnconverted character: " << ch << std::endl;
return false;
}
return true;
}
int main() {
LPCSTR inputs[] = {"12345", "54321a"};
int a;
for (int i=0; i<2; i++) {
check_read(inputs[i], a);
std::cout << "Converted: " << a << std::endl;
}
return 0;
}
另一种合理的可能性是 strtol 或其表亲之一。它们返回一个指向第一个未转换字符(如果有)的指针,因此它们相当直接地告诉您什么是转换的和没有转换的。它们比流更快但通常不太灵活——例如,如果你想读取一个浮点数,上面的 check_read 将按原样工作,但使用 strtol 的东西需要重写。
还有另一种可能性,您可以考虑使用 Boost lexical_cast(打包方式略有不同,但与上面的代码非常相似)。
因为LPCSTR
只是const char*
(在去宏化之后),strlen
就可以了。
但是,如果您正在使用明确定义为与LPCSTR
输入相对应的 windows 函数,那么您可以使用lstrlenA
. 我严重怀疑调用这个和调用是否有任何实际区别strlen
。