我正在尝试使用atoi()将LPCSTR转换为整数,并验证转换是否成功发生我想计算它生成的整数和原始LPCSTR中的位数(它应该只包含但是整数)的
我很难找到计算LPCSTR长度的好方法。到目前为止,唯一的方法似乎只是计数,直到我到达'/ 0'
有关更好方法的任何建议吗?
由于
答案 0 :(得分:20)
要查找LPCTSTR
的长度(在本例中为位数),您应该使用lstrlen()
而不是strlen()
。资料来源:MSDN
答案 1 :(得分:13)
这不是strlen的作用吗?
答案 2 :(得分:8)
您可以使用strtol
并使用返回的endptr
来检查它是否是字符串的结尾(0字节)。
计数不一定准确。 “00”将导致0,但0有一位数,原始字符串长度为2。
答案 3 :(得分:5)
答案 4 :(得分:2)
不。
这就是你如何找到一个c弦的长度。您可以使用strlen
,但仍然必须记下整个字符串并计算'\0'
之前的字符数。
答案 5 :(得分:2)
谈论产生比光更多的热量...... :)停止使用'ati',这将解决你的大部分问题。 'atoi'是一个没有实际价值的死函数。将字符串表示转换为数字的正确方法是来自'strto ...'组('strtol','strtoul'等)的函数。这些函数会向您返回足够的信息,以确定是否发生转换错误。
答案 6 :(得分:1)
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
答案 7 :(得分:0)
我做的事情有点不同 - 用输入初始化字符串流,读取一个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(它的打包方式略有不同,但与上面的代码非常相似)。
答案 8 :(得分:0)
由于let obj = {
z: {
y: 99
}
};
console.profile("foo");
let foo = ({z: {y},x = `${y+1}`}) => x; //prints 100
foo(obj);
console.profileEnd("foo");
console.profile("bar");
let bar = (data) => {let y = data.z.y;
let x = `${y+1}`;
return x; //also prints 100
}
bar(obj);
console.profileEnd("bar");
console.time("foo");
for (let i = 0; i < 100; i++) {
foo(obj);
}
console.timeEnd("foo");
console.time("bar");
for (let i = 0; i < 100; i++) {
bar(obj);
}
console.timeEnd("bar");
只是LPCSTR
(去宏后),const char*
会没问题。
但是,如果您在明确定义的Windows功能与strlen
输入相对应之后,则可以使用LPCSTR
。我非常怀疑这有什么实际的区别,并呼吁lstrlenA
。