Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 28.11.2004, 14:49   [включить плавающее окно]   #1
Breeze
Интересующийся
Автор темы
 
Регистрация: 06.05.2003
Unhappy Проблема с преобразованием переменных (например из int в char)?

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{

// Программа складывает две строки. Первая строка определена line1,
// вторая преобразовывается из int в char.
// во-первых я не пойму почему пишутся звездочки в строке
// (char *line1 = "Sword", *line2, *result)
// во-вторых программа не работает из-за того, что int не преобразовывается
// в char, хотя в книге преобразование показанно так как здесь.
// Я чтал про указатели и ссылки но ужасно во всем этом путаюсь, и мне не
// понятно использование ссылок в этом коде.

int value;
char *line1 = "Sword", *line2, *result;
cout << "Enter line2: ";
cin >> value;

*line2 = char(value);

result = strcat(line1,line2);



getch();
return 0;
}
Breeze вне форума  
Ответить с цитированием
Непрочитано 28.11.2004, 18:56   [включить плавающее окно]   #2
equ
Начинающий
 
Регистрация: 20.12.2003
Адрес: Москва
Звездочка в строке char *line1 = "Sword", *line2, *result; означает, что объявляется указатель (указатель -- число-адрес переменной) на переменную. *line1 = "Sword" объявляет указатель и записывает в него адрес первого символа строки "Sword", которая в свою очередь записывается в память.

char(value) -- лично у меня ничего не делает. Может в книжке было что-нибудь Char иди CHAR? Или у меня старая версия VC++. Могу предложить заменить это на char(value)+'0' -- будет преобразовывать однозначные числа


В строке *line2= звездочка означает разыменовывание указателя, то есть line2 -- это число-адрес, а *line2 это то, что по этому адресу находится.
Далее, когда объявляется указатель *line2, то память выделяется только под сам указатель (который есть число). Так как никакого значения line2 присвоено не было, она указывает на произвольную ячейку памяти. *line2= пытается писать в эту произвольную ячейку и вызывает ошибку доступа к памяти.

И еще, strcat вроде бы дописывает вторую строку к первой и никакой дополнительной памяти не выделяет. А так как в строке line1[] места нету, то может опять произойти ошибка с памятью.

Что делать. Минимально -- изменить строчку на char line1[7] = "Sword", *line2=" ", *result;
equ вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.11.2004, 19:08   [включить плавающее окно]   #3
Ant.ttk
Мужской Продвинутый
 
Аватар для Ant.ttk
 
Регистрация: 16.11.2004
Адрес: Троицк
преобразование int в char:

itoa(int,char*,int);

Например: char pszNum[4]; int a=1; itoa(a,pszNum,4);
__________________
Feel the force, motherf*ckers.
Ant.ttk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.11.2004, 20:44   [включить плавающее окно]   #4
Breeze
Интересующийся
Автор темы
 
Регистрация: 06.05.2003
Речь идет об ANSI C++, работаю я в Builder'e 6 (Раньше в Borland 5.02 но он заглючил )

Я изменил код следующим образом:

int main(int argc, char* argv[])
{
int value;
char *line1[7] = {"Sword"};
char *line2[4]={""};
char *result;

cout << "Enter line2: ";
cin >> value;

itoa(value,*line2,2);

result = strcat(*line1,*line2);

cout << result;

getch();
return 0;
}

Вывод программы:

Enter line2: 3
Sword11

Enter line2: 8
Sword1000

P.S. Раньше я набирал коды в Борланде и мне нравилось, для изучения чистого С++ как раз, но потом начались странные глюки, ОЧЕНЬ часто когда я набираю строку текста вместо кода включается режим Search, и курсор перескакивает на первый найденный символ. Может кто сталкивался?
Breeze вне форума  
Ответить с цитированием
Непрочитано 28.11.2004, 21:36   [включить плавающее окно]   #5
Ant.ttk
Мужской Продвинутый
 
Аватар для Ant.ttk
 
Регистрация: 16.11.2004
Адрес: Троицк
Ээээ... ну ты не совсем правильно понял, но это моя вина. третий пораметр itoa это система исчисления(двоичная, десятеричная....). Я бы написал вот так:

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

int main(int argc, char* argv[])
{

int value;
char line1[] = "Sword";
char line2[4];
char* result;

cout << "Enter line2: ";
cin >> value;

itoa(value,line2,10);

result = strcat(line1,line2);

cout << result;

getch();
return 0;
}
__________________
Feel the force, motherf*ckers.
Ant.ttk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.11.2004, 22:05   [включить плавающее окно]   #6
equ
Начинающий
 
Регистрация: 20.12.2003
Адрес: Москва
Breeze
Ant.ttk

char line1[] = "Sword";

Опять забыли. А куда вы strcat'ом прицеплять будете-то?
Нужно так:

char line1[число] = "Sword";

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

Да, и еще забыл:
strcat(*line1,*line2) это неправильно, так как этой функции нужны два указателя. line1 и line2 это указатели (объявлены как char *<имя>), а *line1 и *line2 это символы (потому что указатели символьного типа), которые лежат в памяти по адресам, на которые указывают line1 и line2.

Последний раз редактировалось equ; 28.11.2004 в 22:10.
equ вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.11.2004, 23:28   [включить плавающее окно]   #7
Breeze
Интересующийся
Автор темы
 
Регистрация: 06.05.2003
equ
Ant.ttk

Большое спасибо за помощ, теперь все получается.
Я читаю "C++ для чайников" и "Учимся программировать на языке С++ Крис Джамса", книги хорошие но там этого нет (itoa, atoi...), может есть статья по поводу преобразований, и работе со строками?

Вот к примеру зачем звездочка в этом месте (char* result

Вторая проблема состоит в том, что я путаюсь в таких понятиях как ссылка, указатель и их синтаксисе.
Смотрю примеры, не понятно то там звездочку поставят то тут (int* string, int *string, int& number_alias = number)

Говорят что в С++ две беды - ссылки и работа со строками.
Breeze вне форума  
Ответить с цитированием
Непрочитано 28.11.2004, 23:50   [включить плавающее окно]   #8
Ant.ttk
Мужской Продвинутый
 
Аватар для Ant.ttk
 
Регистрация: 16.11.2004
Адрес: Троицк
"C++ для чайников" - книга хорошая, про указатели и т.д. там неплохо написано. Если заюзать ресурсы инета, то все выйдет тип топ

2equ. Не гони на меня ).

char line1[] = "Sword";

Здесь компилятор сам определяет это "число". Короче, проверь сам ). Скомпиль(пусть char line2[10]) и запусти. Вуаля, все работает )))).
__________________
Feel the force, motherf*ckers.
Ant.ttk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 29.11.2004, 00:26   [включить плавающее окно]   #9
equ
Начинающий
 
Регистрация: 20.12.2003
Адрес: Москва
Ant.ttk
Цитата
char line1[] = "Sword";
Здесь компилятор сам определяет это "число". Короче, проверь сам ). Скомпиль(пусть char line2[10]) и запусти. Вуаля, все работает )))).
Компилятор несомненно сам определяет число, и я даже могу сказать чего он там определит -- 6. Именно столько нужно на строку "Sword". А функция strcat особо задумываться не будет и припишет в конце то, что ей сказали, в результате чего строка вылезет за отведенные ей границы. При этом если она ничего особо важного не затрет, то все будет прекрасно работать...



Breeze
Цитата
Говорят что в С++ две беды - ссылки и работа со строками.
Это скорее в C такие проблемы. А в С++ столько всего приплюсплюсано...

Про звездочки. В объявлении по-моему нет разницы с какой стороны пробела ставить звездочку.
Объявление char *result создает переменную-указатель (можно считать, что ее тип 'char *'), если не поставить звездочку создастся переменная-символ (тип 'char').
Короче, звездочка в объявлении указывает на тип переменной (указатель), звездочка в других местах программы является (помимо умножения) операцией разыменовывания указателя.
equ вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:01. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey