Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование строк 
V
    Опции темы
_par
Дата 22.2.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 25.1.2007

Репутация: нет
Всего: нет



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

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

invalid conversion from `const char' to `const char*' 
 
подскажите как такое преобразование сделать.
PM MAIL   Вверх
Daevaorn
Дата 22.2.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

на
Код

str[i] - '0'

PM MAIL WWW   Вверх
Rockie
Дата 22.2.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



точнее на 
Код

str[i] - '\0'





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Daevaorn
Дата 22.2.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

не понял. зачем?smile
PM MAIL WWW   Вверх
Rockie
Дата 22.2.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
_par
Дата 22.2.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 25.1.2007

Репутация: нет
Всего: нет



еще несколько вапросав 

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

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

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

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


Ооочень прошу помочь smile
PM MAIL   Вверх
HMLd
Дата 23.2.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



_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(); ?

PM MAIL   Вверх
JackYF
Дата 23.2.2007, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(_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.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
HMLd
Дата 23.2.2007, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



JackYF, точно - это ведь из файла, так что это будет правильно)
PM MAIL   Вверх
vitlic
Дата 23.2.2007, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Код

int i;

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


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

Это сообщение отредактировал(а) vitlic - 23.2.2007, 03:02
PM WWW   Вверх
_par
Дата 23.2.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 25.1.2007

Репутация: нет
Всего: нет



Спасибо вам всем огромное !!!! Разобрался.  smile 
PM MAIL   Вверх
boriska
Дата 23.2.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.12.2006
Где: kharkov

Репутация: нет
Всего: нет



A как насчет : 

Код

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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.