Как мне конвертировать char * в int? - PullRequest
1 голос
/ 10 февраля 2010

Мне нужно преобразовать символ * в целое число. Например:

data.SetBytFldPos(*attribute->value());

Значением в классе атрибута является символ *. SetBytFldPos принимает int.

Ответы [ 9 ]

6 голосов
/ 10 февраля 2010

Вы не конвертируете char * в int. Вы можете проанализировать десятичную строку. Это сделано atoi (). атой ("1") == 1.

6 голосов
/ 10 февраля 2010

много способов. Простейшим является использование функции strtol () .

3 голосов
/ 10 февраля 2010

Если вам нужно убедиться, что ваш char * представляет действительный int, вы можете использовать Boost Lexical Cast

#include <boost/lexical_cast.hpp>

try {
    data.SetBytFldPos(boost::lexical_cast<int>(*attribute->value()));
} catch (bad_lexical_cast) {
    // something is wrong
}
1 голос
/ 10 февраля 2010

Вы также можете написать общий шаблон преобразования строки в X.

template <class T>
T parse(const std::string& s)
{
  T out;
  std::stringstream ss(s);
  ss >> out;
  return out;
}

Использование:

int x = parse<int>("123");
float y = parse<float>("3.14159");
0 голосов
/ 24 июля 2018

Я верю, что это поможет.

int pow(int a, int b)                                                                                                                                                                                                                                                                               
{                                                                                                                                                                                                                                                                                                   
    int val = 1;                                                                                                                                                                                                                                                                                    
    for (int i = 0; i < b; i++)                                                                                                                                                                                                                                                                     
        val *= a;                                                                                                                                                                                                                                                                                   
    return val;                                                                                                                                                                                                                                                                                     
}                                                                                                                                                                                                                                                                                                     

int cp_length(char* cp)                                                                                                                                                                                                                                                                             
{                                                                                                                                                                                                                                                                                                   
    int i = 0;                                                                                                                                                                                                                                                                                      
    while (cp [i] != '\0')                                                                                                                                                                                                                                                                          
        i++;                                                                                                                                                                                                                                                                                        
    return i;                                                                                                                                                                                                                                                                                       
}                                                                                                                                                                                                                                                                                                   

int cptoi(char* cp)                                                                                                                                                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                   
    int val = 0;                                                                                                                                                                                                                                                                                    
    for (int j = cp_length(cp) - 1, i = 0; j >= 0; j--, i++)                                                                                                                                                                                                                                        
        if (cp [i] < 0x30 || cp [i] > 0x39) // if the character is not a digit                                                                                                                                                                                                                      
            continue;                                                                                                                                                                                                                                                                               
        else                                                                                                                                                                                                                                                                                        
            val += (cp [0] == '-' ? -(cp [i] - 0x30) * pow(10, j) : +(cp [i] - 0x30) * pow(10, j)); // accounts for negativity                                                                                                                                                                      

    // This is the thing you need.
    return val;                                                                                                                                                                                                                                                                                     
}
0 голосов
/ 10 февраля 2010

Вы можете

// needed
#include <sstream>

// source, target
char const * p = "123";
int ival;

// conversion
std::stringstream ss(p);
ss >> ival;

Обратите внимание, что мы обычно говорим о "строках", а не о символах *, если мы не имеем в виду указатели.

0 голосов
/ 10 февраля 2010

Я могу думать о четырех направлениях:

  • atoi . Имейте в виду, что эта функция возвращает 0, если она не может проанализировать вашу строку.
  • strtol , более надежная версия atoi. Это может вызвать предупреждение компилятора, потому что вам нужен int и его возвращаемое значение long.
  • Увеличить библиотеку lexical_cast . Мне нравится этот, если вы можете использовать Boost.
  • Используйте stringstream, как показано ниже.

Пример кода:

std::string str(*attribute->value());
std::istringstream myStrm(str);
int val;

myStrm >> val;
0 голосов
/ 10 февраля 2010

Существует простая функция C, называемая atoi, которая не так хороша, потому что обработка ошибок в лучшем случае не интуитивно понятна и ее легко забыть. Функция (C) strtol намного лучше, она делает привычку предпочитать эту функцию atoi. Вот пример кода со страницы руководства:

   #include <stdlib.h>
   #include <limits.h>
   #include <stdio.h>
   #include <errno.h>

   int
   main(int argc, char *argv[])
   {
       int base;
       char *endptr, *str;
       long val;

       if (argc < 2) {
           fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
           exit(EXIT_FAILURE);
       }

       str = argv[1];
       base = (argc > 2) ? atoi(argv[2]) : 10;

       errno = 0;    /* To distinguish success/failure after call */
       val = strtol(str, &endptr, base);

       /* Check for various possible errors */

       if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
               || (errno != 0 && val == 0)) {
           perror("strtol");
           exit(EXIT_FAILURE);
       }

       if (endptr == str) {
           fprintf(stderr, "No digits were found\n");
           exit(EXIT_FAILURE);
       }

       /* If we got here, strtol() successfully parsed a number */

       printf("strtol() returned %ld\n", val);

       if (*endptr != '\0')        /* Not necessarily an error... */
           printf("Further characters after number: %s\n", endptr);

       exit(EXIT_SUCCESS);
   }

Обратите внимание на полное отсутствие каких-либо проверок ошибок для преобразования atoi(argv[2]). Не то, чтобы strtol был слишком простым и интуитивно понятным для проверки ошибок, но, по крайней мере, лучше.

0 голосов
/ 10 февраля 2010

Вы можете использовать функцию atoi ()

data.SetByteFldPos(atoi(attribute->value()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...