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


Автор: _par 22.2.2007, 19:48
есть строка "123456" мне надо по символьно их переделывать в int.

функцией atoi(str); получается преобразовать только всю строку. Если делать atoi(str[1]); то пишет 
Код

invalid conversion from `const char' to `const char*' 
 
подскажите как такое преобразование сделать.

Автор: Daevaorn 22.2.2007, 19:50
земени
Цитата(_par @  22.2.2007,  20:48 Найти цитируемый пост)
atoi(]); 

на
Код

str[i] - '0'

Автор: Rockie 22.2.2007, 22:23
точнее на 
Код

str[i] - '\0'



Автор: Daevaorn 22.2.2007, 22:29
Цитата(Rockie @  22.2.2007,  23:23 Найти цитируемый пост)
точнее на 

не понял. зачем?smile

Автор: Rockie 22.2.2007, 23:08
Цитата(Daevaorn @  22.2.2007,  22:29 Найти цитируемый пост)
 зачем? smile 

хз  smile напутал..

Автор: _par 22.2.2007, 23:21
еще несколько вапросав 

1.Как перевести из числа в строку.

2.Как хранить очень большие числа которые не влазят не в один тип,вродебы в масиве чаров, но непонимаю как патом таким числом пользоваться.

3.Как работать с массивами. Приведите пример объявление.

4.Как считывать из файла по строчно , есть например строка "123 321 321" как мне её разбить на отдельные переменные, ну есть что нибудь наподобии php-ешного explode(); ?


Ооочень прошу помочь smile

Автор: HMLd 23.2.2007, 02:11
_par, 
Цитата

есть строка "123456" мне надо по символьно их переделывать в int.

заюзать atoi не получится - так как по синтаксису надо передавать указатель на строку, или адрес первого элемента, т.е. в твоём случае что-то типа
Код

int foo = atoi(str);

or
Код

for (int i = 0; i < strlen(str); i++)
     printf("%i ", atoi(&str[i]));


Но это не подойдёт, т.к. преобразуется вся строка, т.е. у тебя получится число, равное 12345;
Вот возможный вариант решения:

Код

for (int i = 0; i < strlen(str); i++)
     printf("%i ", str[i] - 48);

Дело в том, что разница в ASCII между символом '0' и цифрой 0 равна 48, а значит и между всеми цифрами.
Цитата

1.Как перевести из числа в строку.

Перевести из числа в строку можно, например так: выделить все цифры числа и копировать в массив чаров, прибавляя число 48. Но это как-то марудно, сейчас ещё подумаю, может найду чего.
Цитата

2.Как хранить очень большие числа которые не влазят не в один тип,вродебы в масиве чаров, но непонимаю как патом таким числом пользоваться.

Для хранения больших чисел (кстати, чем тебя не устраивает __int64 ??? Диапазон значений от   -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807. Синтаксис такой:
scanf("%I64d", &a)) используется так называемая длинная арифметика. Считываем из файла символы, на ходу преобразовывая их в числа. Затем переворачиваем массив, т.е. в нулевом элементе у нас хранится размер массива, в 1-ом - единицы, во 2-ом - десятки и т.д.
Далее выполняешь все действия, как тебя учили в школе - т.е. столбиком)
Вот пример моего исходника для пары операций:
Код

#include <stdio.h>
#include <ctype.h>
#include <mem.h>
#include <time.h>

double start = (double)clock();

FILE* in = fopen("input.txt", "r");
FILE* out = fopen("output.txt", "w");

const int MAX = 200;

void GetNum(int* rhs)
{
    *rhs = 0;
    char ch = '\0';
    while (!isdigit(ch))
        ch = getc(in);
    while (isdigit(ch))
    {
        *(rhs + ++(*rhs)) = ch - 48;
        ch = getc(in);
    }
}

void Revert(int* rhs)
{
    for(register int i = 0; i < *rhs / 2; i++)
    {
        int tmp = *(rhs + i + 1);
        *(rhs + i + 1) = *(rhs + *rhs - i);
        *(rhs + *rhs - i) = tmp;
    }
}

// Если первое больше, возвращаем true
bool Compare(int* f, int* s)
{
    if (*f > *s)
        return true;
    if (*f < *s)
        return false;
    for(register int i = *f; i > 0; i--)
        if (*(f + i) < *(s + i))
            return false;
    return true;
}

void Shift(int* rhs)
{
    for(register int i = 1; i <= *rhs; i++)
        if (*(rhs + i) > 9)
        {
            *(rhs + i + 1) += (*(rhs + i) / 10);
            *(rhs + i) %= 10;
            if (i == *rhs)
                (*rhs)++;
        }
}

void Plus(int* f, int* s, int* rhs)
{
    int* min = *f > *s ? s : f;
    int* max = *f > *s ? f : s;
    *rhs = *max;
    for(register int i = 1; i <= *min; i++)
        *(rhs + i) = *(f + i) + *(s + i);
    for(register int i = *min + 1; i <= *max; i++)
        *(rhs + i) = *(max + i);
    Shift(rhs);
}

void Minus(int* f, int* s, int* rhs)
{
//    Revert(f);
//    Revert(s);
    int* max = NULL;
    int* min = NULL;
    if (Compare(f, s))
    {
        max = f;
        min = s;
    }
    else
    {
        max = s;
        min = f;
    }
    *rhs = *max;
    for(register int i = 1; i <= *max; i++)
    {
        *(rhs + i) = *(max + i) - *(min + i);
        if (*(rhs + i) < 0)
        {
            (*(max + i + 1))--;
            *(rhs + i) += 10;
        }
    }
    while (!*(rhs + *rhs) && *rhs)
        (*rhs)--;
}

void Initialize(int* f, int* s, int* res)
{
    memset(f, 0, sizeof(int) * MAX);
    memset(s, 0, sizeof(int) * MAX);
    memset(res, 0, sizeof(int) * MAX);
}

void Output(int* rhs)
{    
    if (!(*rhs))
        fprintf(out, "0");
    else
        for(register int i = *rhs; i > 0; i--)
            fprintf(out, "%i", *(rhs + i));
}

int main()
{
    int* f = new int[MAX];
    int* s = new int[MAX];
    int* res = new int[MAX];
    Initialize(f, s, res);
    GetNum(f);
    GetNum(s);
    Revert(f);
    Revert(s);
    Plus(f, s, res);
    fprintf(out, "The Plus is:\n");
    Output(res);
    memset(res, 0, sizeof(int) * MAX);
    Minus(f, s, res);
    fprintf(out, "\n\nThe Minus is:\n");
    Output(res);
    delete [] res;
    delete [] f;
    delete [] s;
    fprintf(out, "\nThe time was: %f seconds.", (clock() - start) / CLK_TCK);
    _fcloseall();
    return 0;
}



По работе с массивами - RTFM  smile 

Не совсем понимаю ,что ты имеешь в виду под 
Цитата

4.Как считывать из файла по строчно , есть например строка "123 321 321" как мне её разбить на отдельные переменные, ну есть что нибудь наподобии php-ешного explode(); ?

Автор: JackYF 23.2.2007, 02:44
Цитата(_par @  22.2.2007,  23:21 Найти цитируемый пост)
4.Как считывать из файла по строчно , есть например строка "123 321 321" как мне её разбить на отдельные переменные, ну есть что нибудь наподобии php-ешного explode(); ?


ну, возможно, это поможет:
Код

#include <fstream>
...
int a1, a2, a3;
ifstream file("infile.dat");
file >> a1 >> a2 >> a3;

Это было считывание трех интовых переменных smile.

Автор: HMLd 23.2.2007, 02:51
JackYF, точно - это ведь из файла, так что это будет правильно)

Автор: vitlic 23.2.2007, 03:00
Код

int i;

ifstream file("infile.dat");          //create file for input
while( !file.eof( ) )                //until end-of-file
{
        file >> i;
        // делай с ним что-то          
}


так можно считать весь файл до конца.

Автор: _par 23.2.2007, 10:06
Спасибо вам всем огромное !!!! Разобрался.  smile 

Автор: boriska 23.2.2007, 11:57
A как насчет : 

Код

string str("123456");
    
for(int i = 0; i < 6; ++i)
{
    int val = atoi(str.substr(i, 1).c_str());
    cout << "val = " << val << endl;
}

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