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

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

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

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

Спасибо

9 ответов

Решение

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

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

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

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

Функция strlen() - это то, что вы ищете.

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

size_t len = strlen( szNumber );

Нету.

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

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

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

Поскольку LPCSTR просто const char* (после демакроя), strlen будет хорошо.

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

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

Другие вопросы по тегам