14

我正在尝试使用 atoi() 将 LPCSTR 转换为整数,并验证转换是否成功我想计算它产生的整数和原始 LPCSTR 中的位数(它应该只包含整数)

我很难找到一种计算 LPCSTR 长度的好方法。到目前为止,唯一的方法似乎只是计数,直到我得到一个'/0'

对更好的方法有什么建议吗?

谢谢

4

9 回答 9

24

要查找 的长度(在本例中为位数)LPCTSTR,您应该使用lstrlen()而不是strlen()。资料来源:MSDN

于 2013-03-14T00:36:28.403 回答
18

这不是 strlen 所做的吗?

于 2009-10-13T18:17:53.397 回答
8

您可以使用strtol并使用endptr返回来检查它是否是字符串的结尾(0 字节)。

计数不一定准确。"00" 将产生 0,但 0 有一位,原始字符串的长度为 2。

于 2009-10-13T18:19:20.663 回答
5

strlen()函数是您正在寻找的。

示例用法:

size_t len = strlen( szNumber );
于 2009-10-13T18:19:32.883 回答
2

没有。

这就是你如何找到一个 c 字符串的长度。您可以使用strlen,但它仍然必须遍历整个字符串并计算 a 之前的字符数'\0'

于 2009-10-13T18:17:10.963 回答
2

谈论产生比光更多的热量...... :) 停止使用'atoi',这将解决你的大部分问题。'atoi' 是一个死函数,没有实用价值。将字符串表示形式转换为数字的正确方法是来自“strto...”组(“strtol”、“strtoul”等)的函数。这些函数将向您返回足够的信息,以便立即确定是否发生了转换错误。

于 2009-10-13T18:39:43.873 回答
1
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
于 2009-10-13T20:34:13.750 回答
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(打包方式略有不同,但与上面的代码非常相似)。

于 2009-10-13T18:47:42.233 回答
0

因为LPCSTR只是const char*(在去宏化之后),strlen就可以了。

但是,如果您正在使用明确定义为与LPCSTR输入相对应的 windows 函数,那么您可以使用lstrlenA. 我严重怀疑调用这个和调用是否有任何实际区别strlen

于 2017-01-09T03:44:47.830 回答