Преобразование Const char * в Unsigned long int - strtoul
Я использую следующий код для преобразования Const char *
в Unsigned long int
, но на выходе всегда 0
, Где я делаю не так? Пожалуйста, дайте мне знать.
Вот мой код:
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
int main()
{
vector<string> tok;
tok.push_back("2");
const char *n = tok[0].c_str();
unsigned long int nc;
char *pEnd;
nc=strtoul(n,&pEnd,1);
//cout<<n<<endl;
cout<<nc<<endl; // it must output 2 !?
return 0;
}
3 ответа
Вам необходимо использовать:
nc=strtoul(n,&pEnd,10);
Ты использовал base=1
это означает, что разрешены только нули.
Если вам нужна информация о целочисленных базах, вы можете прочитать это
Используйте базу-10:
nc=strtoul(n,&pEnd,10);
или разрешить автоопределение базы:
nc=strtoul(n,&pEnd,0);
Третий аргумент strtoul
это база, которую нужно использовать, и вы использовали ее как базу-1.
Функция стандартной библиотеки C strtoul принимает в качестве третьего аргумента основание / основание системы счисления, которое будет использоваться при интерпретации массива char, на который указывает первый аргумент.
Где я делаю не так?
nc = strtoul (n, & pEnd,1);
Вы передаете основание как 1, что приводит к унарной системе счисления, то есть единственное число, которое может быть представлено как 0. Следовательно, вы получите только это в качестве выходных данных. Если вам нужна интерпретация десятичной системы, передайте 10 вместо 1.
В качестве альтернативы, передача 0 позволяет функции автоматически определять систему на основе префикса: если она начинается с 0, то она интерпретируется как восьмеричная, если она равна 0x или 0X, она принимается как шестнадцатеричная, если она имеет другие цифры, она принимается за десятичный.
В сторону:
- Если вам не нужно знать символ, до которого рассматривалось преобразование, то передача фиктивного второго параметра не требуется; ты можешь пройти
NULL
вместо. - Когда вы используете стандартную библиотечную функцию C в программе на C++, рекомендуется включать версию заголовка C++; с префиксом
c
без суффикса.h
например, в вашем случае это было бы#include <cstdlib>
using namespace std;
считается плохой практикой