Преобразование 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; считается плохой практикой
Другие вопросы по тегам