Как найти длину LPCSTR
Я пытаюсь преобразовать LPCSTR в целое число с помощью atoi (), и чтобы убедиться, что преобразование произошло успешно, я хочу подсчитать количество цифр в целом числе, которое оно произвело, и исходное LPCSTR (оно должно содержать только целые числа)
Мне трудно найти хороший способ рассчитать длину LPCSTR. Пока только так кажется, просто пока я не добраться до '/0'
любые предложения для лучшего метод?
спасибо
9 ответов
найти длину (в данном случае, количество цифр) при LPCTSTR
, вы должны использовать lstrlen()
, а не strlen()
. Источник:MSDN
можно использовать strtol
и с помощью endptr
возвращается, чтобы проверить, является ли это концом строки (0 байт).
подсчет не обязательно будет точным. "00" приведет к 0, но 0 имеет одну цифру, а исходная строка имеет длину 2.
Неа.
вот как вы находите длину c-строки. Вы могли бы использовать strlen
, но он все равно должен спуститься по всей строке и подсчитать количество символов перед ''
.
говорить о производстве больше тепла, чем света... :) Прекратите использовать "atoi", и это решит большинство ваших проблем. "атои" - мертвая функция, не имеющая практической ценности. Правильный способ преобразования строкового представления в число-это функции из ' strto... группа ("strtol", "strtoul" и др.)). Эти функции вернут вам достаточно информации, чтобы сразу определить, произошла ли ошибка преобразования или нет.
Я бы сделал все немного по-другому - инициализируйте 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
хотя.