Как найти длину LPCSTR

Я пытаюсь преобразовать LPCSTR в целое число с помощью atoi (), и чтобы убедиться, что преобразование произошло успешно, я хочу подсчитать количество цифр в целом числе, которое оно произвело, и исходное LPCSTR (оно должно содержать только целые числа)

Мне трудно найти хороший способ рассчитать длину LPCSTR. Пока только так кажется, просто пока я не добраться до '/0'

любые предложения для лучшего метод?

спасибо

9 ответов


разве это не то, что делает strlen?


найти длину (в данном случае, количество цифр) при LPCTSTR, вы должны использовать lstrlen(), а не strlen(). Источник:MSDN


можно использовать strtol и с помощью endptr возвращается, чтобы проверить, является ли это концом строки (0 байт).

подсчет не обязательно будет точным. "00" приведет к 0, но 0 имеет одну цифру, а исходная строка имеет длину 2.


на strlen () - это то, что вы ищете.

пример использования:

size_t len = strlen( szNumber );

Неа.

вот как вы находите длину c-строки. Вы могли бы использовать strlen, но он все равно должен спуститься по всей строке и подсчитать количество символов перед ''.


говорить о производстве больше тепла, чем света... :) Прекратите использовать "atoi", и это решит большинство ваших проблем. "атои" - мертвая функция, не имеющая практической ценности. Правильный способ преобразования строкового представления в число-это функции из ' strto... группа ("strtol", "strtoul" и др.)). Эти функции вернут вам достаточно информации, чтобы сразу определить, произошла ли ошибка преобразования или нет.


LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();

Я бы сделал все немного по-другому - инициализируйте stringstream с помощью ввода, прочитайте 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* (после де-macroing), strlen будет хорошо.

однако, если вы после функции windows, явно определенной для соответствия с LPCSTR input, тогда вы можете использовать lstrlenA. Я серьезно сомневаюсь, что есть какая-то практическая разница, называя это и называя strlen хотя.