Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Из строкового в целочисленный

Автор: first_day 22.12.2007 17:15

Подскажите, пожалуйста, как в С++ перевести из int в string и наоборот.

Автор: volvo 22.12.2007 17:29

Так тебе надо Число -> Строка или наоборот? smile.gif У тебя в сообщении и в заголовке разные вещи написаны...

Число -> Строка: зависит от компилятора... Если MS, то _itoa/_ltoa/_ultoa (для целочисленных типов) _ecvt/_fcvt/_gcvt (для вещественных) или воспользоваться возможностями sprintf и "впечатать" число в строку, завершив ее нулем:

sprintf(s, "%7.2f\0", value);


Строка -> Число: atoi/atol/atof (в зависимости от типа числа)

Автор: first_day 22.12.2007 17:35

Компилятор у меня MinGW Developer Studio. Мне нужно перевести и из строкового в целочисленный, и обратно.
Вот например у меня есть строковая переменная s, мне нужно ее записать в целочисленную переменную.

делаю
m=atoi(s1);
Выдает ошибку
cannot convert `std::string' to `int' for argument `1' to `char* itoa(int, char*, int)'

Автор: volvo 22.12.2007 17:44

...
char *s = "187"; // Исходная строка
char buffer[128] = "\0"; // Место под ПЕРЕконвертированную из int строку

int val = atoi(s); // строка -> число
itoa(val, buffer, 10); // число -> строка
...



В GCC 3.4.4 (насколько я помню, MinGW DevStudio компилирует GCC) прекрасно отрабатывает...

Автор: first_day 22.12.2007 17:59

А я ее как string объявлял...
Если мне нужно из строковой переменной взять только первые 2 символа?

Автор: volvo 22.12.2007 18:05

Значит, скопируй первые 2 символа в промежуточный буфер и их конвертируй (я использовал переменную buffer, чтоб не вводить еще одну, все равно потом результат конвертации число -> строка запишется туда же...):

    int val = atoi(strncpy(buffer, s, 2));
itoa(val + 10, buffer, 10); // +10 чтобы было видно, что действительно происходит конвертация



Автор: first_day 22.12.2007 18:15

Компилируется, запускается, а потом ругается...


char buffer[128] = "\0";
char *s;
int m=atoi(strncpy(buffer, s, 2));


Автор: volvo 22.12.2007 18:17

Во-первых, КАК ругается? Во-вторых, у тебя s не инициализирован, посмотри пост №4...

Автор: first_day 22.12.2007 18:32

если инициализирую при описани переменной все нормально, а если считываю из файла - завершает работу и возвращает кодом -1073741819.
Но, наверно я не правильно считываю...

f_in>>s;

В файле записано "11:03"

Автор: volvo 22.12.2007 18:43

smile.gif Нет, так нельзя... Если ты пишешь

char *s = "123";

, то у тебя есть собственно строка, и s - указатель на нее (это берет на себя компилятор)... Если же у тебя только
char *s;
, то указатель-то есть, а вот строки нет. И при попытке обращения "в никуда" будет ошибка. Выделяй место под строку в таком случае:

    char s[20];
...
f >> s;
должно работать...

Автор: first_day 22.12.2007 18:55

Понял, это поучилось.

А как можно "вырезать" например 2 символа начиная с какой-то позиции(например 3);

int m=atoi(strncpy(buffer, s, 2));



Так можно только сначала?

Автор: volvo 22.12.2007 19:10

Чтобы начиная с третьего символа скопировать 2 (нулевой, первый и второй - три символа - должны быть пропущены, то есть, s должно быть увеличено на 3):

int val = atoi(strncpy(buffer, s + 3, 2));

Можно и искать позицию ':' в строке, увеличивать ее на 1 и начиная оттуда конвертировать 2 символа:
int val = atoi(strncpy(buffer, strstr(s, ":") + 1, 2));


Автор: first_day 22.12.2007 19:30

Огромное спасибо! smile.gif