Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > string2int


Автор: box 10.4.2011, 20:45
как преобразовать из string в int ? делаю так :
Код

.................
const vector<string> line( split( setting, "|" ) );
int stop, stop1;
    sprintf( stop, "%d", line[0] );
    sprintf( stop1, "%d", line[1] );

но так не работает .
--------------------------
вопрос решен так:
Код

#include <sstream>
using namespace std;

int integer(const string& s)
{
istringstream buf(s);
int a;
buf >> a;
return a;
}

Автор: bsa 11.4.2011, 10:03
box, более красивое решение:
Код
template<typename T>
T string_cast<T>(const std::string &s)
{
   std::istringstream stream(s);
   T ret;
   if ((stream >> ret).fail())
      throw std::bad_cast("Bad cast from string");
   return ret;
}

...
double d = string_cast<double>(str);
...
int i = string_cast<int>(str);
...

Автор: xvr 11.4.2011, 13:14
Цитата(box @  10.4.2011,  20:45 Найти цитируемый пост)
как преобразовать из string в int ? делаю так :
Код

const vector<string> line( split( setting, "|" ) );
int stop, stop1;
    sprintf( stop, "%d", line[0] );
    sprintf( stop1, "%d", line[1] );

но так не работает .
Забыли сказать 'Крибле Крабле Бумс' и полить монитор и системный блок святой водой  smile 
Описание функции sprintf не пытались почитать? Оно не является великой тайной, и доступно не только полным адептам С++ 10го уровня  smile Она делает прямо противоположное тому, что вам надо  smile 


Автор: borisbn 11.4.2011, 15:55
 smile 
xvr, какой-то день интересный: то один пишет поератор '<<' для чтения из файла, то другой sprintf для преобразования из строки в число  smile 

Автор: leniviy 12.4.2011, 13:34
это всё ненадёжно. integer("123garbage") вернёт 123, и вы даже не узнаете, что была ошибка.
Надо так:
Код

/* check strtol()/strtod() result */
static int strtox_check(char *nptr, char *endptr) {
    char dummys[2];
    /* Check for various possible errors */

    /* if ((errno == ERANGE && (*n == LONG_MAX || *n == LONG_MIN))
           || (errno != 0 && *n == 0)) { */
    if (errno != 0) {
        /*pdebug8("strtol(): failed\n");*/
        return errno;
    }

    /*pdebug8("strtol(): nptr: '%s', endptr: '%s'\n", nptr, endptr);*/

    if (nptr == endptr) {
        /*pdebug8("strtol(): No digits were found\n");*/
        return -1;
    }

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

    if (*endptr != '\0' && *endptr != '\n' && sscanf(endptr, "%1s", dummys)>0) {
        /*pdebug8("strtol(): Further characters after number: %s\n", endptr);*/
        return -1;
    }

    return 0;
}

int main() {
    char *endptr;
    char str[] = "123garbage";
    long l = strtol(str, &endptr, 10);
    if (0 != strtox_check(str, endptr)) {
        printf("bad number: '%s'\n", str);
        return 1;
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)