Как найти длину LPCSTR - PullRequest
       30

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

9 голосов
/ 13 октября 2009

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

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

Какие-нибудь предложения для лучшего метода?

Спасибо

Ответы [ 9 ]

20 голосов
/ 14 марта 2013

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

13 голосов
/ 13 октября 2009

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

8 голосов
/ 13 октября 2009

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

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

5 голосов
/ 13 октября 2009

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

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

size_t len = strlen( szNumber );
2 голосов
/ 13 октября 2009

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

2 голосов
/ 13 октября 2009

Нет.

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

1 голос
/ 14 октября 2009
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
0 голосов
/ 09 января 2017

Так как LPCSTR - это просто const char* (после демомасштабирования), strlen будет в порядке.

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

0 голосов
/ 13 октября 2009

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

...