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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CИ++. Работа с указателями. 
:(
    Опции темы
ScarfaseV
Дата 7.9.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
//'10'-10-'10'
#include <stdio.h>
#include <conio.h>

char *inttostr(int chislo);
int strtoint(char *s);

void main(void)
{
clrscr();
char *Numbers[] = {"000","123","777","1000","535","10"};
for (int i = 0; i < 6; i++)
printf("\n String %s, \t int %d, \t String %s", Numbers[i],
       strtoint(Numbers[i]), inttostr(strtoint(Numbers[i])));
}

char *inttostr(int chislo)
{ char *s="000000";
  int n,pos=5;

  while (chislo > 0){
    n = chislo % 10;
    chislo /=10;
    s[pos--]='0'+n;   !!!!!!
    }
    while (pos>-1) 
    s[pos--]='0';        также непонятна эта строка.
return s;
}

int strtoint(char *s)
{int sum=0;
while (*s)
 sum= sum*10+(*s++ -'0'); !!!!!!!
 return (sum);
 }

Этот код предназначен для перевода десятичных чисел из одного типа в другой (числовой и строковый)
Код вроде понятен, а вопрос в том, зачем выполнять операцию сложения с '0', в строках отмеченных восклицательным знаком. Почему именно когда мы прибавляем '0' мы получаем верный результат? Ведь s это указатель, почему ему нельзя присваивать адрес переменной n, т.е s[5]=&n?

Модератор: не забываем пользоваться конпкой "Код".

Это сообщение отредактировал(а) bsa - 7.9.2009, 10:56
PM MAIL   Вверх
MAKCim
Дата 7.9.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



1. код очень плохой
2. есть strto[u]l[l] и snprintf
3. 
Цитата(ScarfaseV @  7.9.2009,  00:53 Найти цитируемый пост)
зачем выполнять операцию сложения с '0'

символы '0'-'9' в ASCII расположены смежно и соответствуют кодам 0x30-0x39
поэтому для получения символа, который соответствует десятичной цифре 0-9 мы прибавляем к ней код '0' - 0x30

Цитата(ScarfaseV @  7.9.2009,  00:53 Найти цитируемый пост)
Ведь s это указатель, почему ему нельзя присваивать адрес переменной n, т.е s[5]=&n? 

можно, только это не решает задачу ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



эта функция нерабочая
Код

char *inttostr(int chislo)

    char *s = "000000";
    int n, pos=5;
    while (chislo > 0){
        n = chislo % 10;
        chislo /=10;
        s[pos--]='0' + n;  //здесь крах программы..
    }
    while (pos>-1) 
        s[pos--]='0';   //сюда дойти неуспеет     
    return s;
}

PM MAIL Skype   Вверх
Annihilator
Дата 7.9.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Цитата(ScarfaseV @  7.9.2009,  04:53 Найти цитируемый пост)
Ведь s это указатель, почему ему нельзя присваивать адрес переменной n, т.е s[5]=&n

потому что s[5] это char, а &n - это int*


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Cheloveck
Дата 7.9.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ScarfaseV @  7.9.2009,  01:53 Найти цитируемый пост)
char *inttostr(int chislo)
{ char *s="000000";
  int n,pos=5;

  while (chislo > 0){
    n = chislo % 10;
    chislo /=10;
    s[pos--]='0'+n;   !!!!!!
    }
    while (pos>-1) 
    s[pos--]='0';        также непонятна эта строка.
return s;
}

нельзя возвращать указатель на переменную из стека. Тут у тебя в лучшем случае - креш программы, в худшем - будет работать (но не всегда).
Я тут недавно себе писал, что-то вроде этого
Код

#include <iostream>

bool str2int( int & result, const char *str, int strlen )
{
    if( strlen <= 0 || !str )
        return false;
    result = 0;
    int i = 0;
    bool minus = false;
    if( str[0] == '-' )
    {
        minus = true;
        i = 1;
    }
    for( ; i < strlen; i++ )
    {
        if( str[i] > 47 && str[i] < 59 )
            result = result * 10 + str[i] - 48;
        else
            return false;
    }
    if( minus )
        result = -result;
    return true;
}

int main()
{
    char str[] = "-123456";
    int value;
    if( !str2int( value, str, strlen( str ) ) )
        std::cerr << "error\n";
    else
        std::cout << value;
    return 0;
}

Обратно не сложнее.

Это сообщение отредактировал(а) Cheloveck - 7.9.2009, 09:05


--------------------
user posted image
PM Jabber   Вверх
ScarfaseV
Дата 7.9.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ISergeyN @ 7.9.2009,  01:22)
эта функция нерабочая
Код

char *inttostr(int chislo)

    char *s = "000000";
    int n, pos=5;
    while (chislo > 0){
        n = chislo % 10;
        chislo /=10;
        s[pos--]='0' + n;  //здесь крах программы..
    }
    while (pos>-1) 
        s[pos--]='0';   //сюда дойти неуспеет     
    return s;
}

почему функция нерабочая? программа нормально работает, выдает результат
И встеаки, для чего предназначен этот кусок кода   
Код

while (pos>-1) 
        s[pos--]='0'; 


Это сообщение отредактировал(а) ScarfaseV - 7.9.2009, 16:48
PM MAIL   Вверх
Cheloveck
Дата 7.9.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ScarfaseV @  7.9.2009,  17:45 Найти цитируемый пост)
почему функция нерабочая?

1. Выделение памяти в стеке.
2. Выделение памяти всего для шести символов
3. 
Цитата(ScarfaseV @  7.9.2009,  17:45 Найти цитируемый пост)
 s[pos--]='0' + n;  //здесь крах программы..

здесь крах программы, при числе более 6 символов.

Цитата(ScarfaseV @  7.9.2009,  17:45 Найти цитируемый пост)
И встеаки, для чего предназначен этот кусок кода   
Код

while (pos>-1) 
        s[pos--]='0'; 

по видимому, если в числе менее 6 знаков, она должна забить нулями все впереди стоящие (бред имхо). 

Цитата(ScarfaseV @  7.9.2009,  17:45 Найти цитируемый пост)
программа нормально работает, выдает результат

Цитата(Cheloveck @  7.9.2009,  10:01 Найти цитируемый пост)
Тут у тебя в лучшем случае - креш программы, в худшем - будет работать




--------------------
user posted image
PM Jabber   Вверх
andrew_121
Дата 7.9.2009, 17:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(ISergeyN @  7.9.2009,  01:22 Найти цитируемый пост)
s[pos--]='0' + n;  //здесь крах программы..

вообще странно. это указатель на константный массив.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
ScarfaseV
Дата 7.9.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Cheloveck @ 7.9.2009,  17:28)
Цитата(ScarfaseV @  7.9.2009,  17:45 Найти цитируемый пост)
И встеаки, 
по видимому, если в числе менее 6 знаков, она должна забить нулями все впереди стоящие (бред имхо). 

Просто без этого куска кода, результаты переводов некоторых чисел из типа int обратно в строку получаются неправильными, а с ним все работает. А при числах 0, 123, 777, 1000, 535, 10 в третьем столбике выходят сообщения об ошибках ( 1 столбец String, 2 столбец int, 3 столбец String т.е когда числа переводят в строку)
PM MAIL   Вверх
Anikmar
Дата 7.9.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(andrew_121 @  7.9.2009,  17:40 Найти цитируемый пост)
вообще странно. это указатель на константный массив. 

Об этом уже как-то спорили.
ИМХО Не считаю это правильным, но и ошибки здесь не вижу.
Например код:
Код

#include <conio.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    char *pStr = "This is my string!";
    char *p1;

    std::cout << pStr << std::endl;
    p1 = pStr;
    while (*p1 != 0) (*p1++)++;
    std::cout << pStr << std::endl;

    getch();

    return 0;
}


По идее должен работать. Например, в BDS даже специальные опции в проекте есть - размещать строки в сегментах только для чтения или нет. Думаю это правильно - зачем надуманные ограничения? Программер пусть сам отвечает за свои действия.
Сразу оговорюсь даже не собираюсь спорить -  это ИМХО.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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