Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2010, 13:14   #1
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию Память для динамической строки

Здравствуйте, вот возникла проблема, над которой ломаю голову всё утро. При создании динамического массива и введении в него более одного символа, массив заполняется каким-то мусором и функция strlen, возвращает 0.
Пытаюсь написать текстовый редактор на C, но не получается даже просто строку правильно заполнить и вывести на экран. Вещь в том, что мне нужно знать где находится последний введенный мною символ, чтобы после него добавить символ конца строки.
Пожалуйста подскажите что я упускаю из виду? (MS VS 2008)
Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>

void main() {
	char *editor = new char[100];
	strcpy(editor, " ");
	int i = 0;
	while (i < 3) {
		*(editor + i) = _getch();
		i++;
	}
	*(editor + strlen(editor)) = '\0';
	puts(editor);
	delete [] editor;
}
Tirendus вне форума Ответить с цитированием
Старый 29.04.2010, 14:15   #2
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Во первых это не Си.( В си нет new и delete).

вместо strcpy() можно заполнить editor нулями ('\0'), memset(editor, 0, 100). или использовать вместо new, malloc( size_t size )
А что по поводу символа конца строки, так разве он не заносится в editor когда пользователь нажимает ввод?

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main () 
{
  int i = 0;
  char *editor = malloc ( sizeof(char) * 100 );
  char *tmp;
  tmp = editor;  
  do 
  {
    *tmp = getch();
    tmp++;
  } while (*tmp != '\n');
  puts (editor);
  free (editor);
  return 0;
}

Последний раз редактировалось Goblin; 29.04.2010 в 14:23.
Goblin вне форума Ответить с цитированием
Старый 29.04.2010, 14:23   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в свое время применял это для новых строк.
Код:
#ifdef UNICODE
 #define newstr newstrA
#else
 #define newstr newstrW
#endif
 
char* newstrA(int count)//кол-во символов включая нулевой
{
    char* t=(char*)malloc(count);
    t[count-1]=0;
    return t;
}//ANSI строка

WCHAR* newstrW(int count)//кол-во символов включая нулевой
{
    WCHAR* t=(WCHAR*)malloc(count*2);
    t[count-1]=0;
    return t;
}//Unicode строка
естественно у вас должен быть уже приинклюден malloc.h и windows.h(WCHAR там описана, можно на wchar_t заменить(тогда windows.h не нужен))
в таком случае нулевой символ будет с самого начала заполнен и strlen вернет то что надо(count-1).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2010, 15:02   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Tirendus Посмотреть сообщение
Пожалуйста подскажите что я упускаю из виду? (MS VS 2008)
Код:
	*(editor + strlen(editor)) = '\0';
то что у строки в данный момент нет конца, поэтому strlen() сработает неправильно.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 29.04.2010, 15:17   #5
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Goblin,
Это действительно C, консольное приложение. Компилятор ругается на использование malloc.
Пепел Феникса,
Спасибо, это может пригодиться, но всё же вопрос не совсем в этом. Вопрос в том, почему после ввода второго символа массив заполняется мусором(символ '=') и как этого избежать.
ozo,
Спасибо, до этого я додумался, но вопрос не в том почему не выводится строка, а как сделать так, чтобы в массив можно было вносить информацию без мусора.

Используя вот этот код

Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>

void main() {
	char *editor = new char[100];
	strcpy(editor, " ");
	*(editor+99) = '\0';
	int i = 0;
	while (i < 3){
		*(editor + i) = getch();
		i++;
	}
	*(editor + strlen(editor)) = '\0';
	puts(editor);
	delete [] editor;
}
Я получаю из puts три введенных мною символа и "это" - '================================== =================================== ================'
примерно так
Tirendus вне форума Ответить с цитированием
Старый 29.04.2010, 15:21   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Код:
Компилятор ругается на использование malloc
#include <malloc.h>

Код:
Это действительно C
но не чистый С.
в студии пишете?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2010, 15:27   #7
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Ага VS 2008.

Цитата:
массив изначально обычно заполнен им
Я понимаю, но ведь такая операция
Код:
strcpy(editor, " ");
должна была заполнить массив пустыми символами.
Tirendus вне форума Ответить с цитированием
Старый 29.04.2010, 15:31   #8
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Код:
strcpy(editor, "\0");
лучше так, если не получится, тогда через цикл заполните всю строку символом конца строки, т.е. '\0'
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 29.04.2010, 15:33   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
должна была заполнить массив пустыми символами.
вообще то лишь первый символ изменит(ну и скорее всего второй изменить в ноль(не помню, давно не юзал их))
мы же копируем строку, а не заполняем её
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2010, 15:37   #10
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

mrChester,
Сделал, после того, как я заполняю массив хотябы одним симвлом, все оставшиеся элементы массива заполняются символом "=", а последние четыре похожи на звездочку. При том размер массива становится вместо 100, как задано изначально в 105 элементов.
Tirendus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Win Api 1 05.04.2010 20:08
Win Api: использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Помощь студентам 0 05.04.2010 19:55
Найдите ошибку. Строки. Динамич. память Познающий Общие вопросы C/C++ 8 04.09.2009 17:37
Возможно ли сделать рабочий Transparent для Image, созданной на динамической форме2, для формы1. Лукманов Александр Мультимедиа в Delphi 3 27.04.2009 14:12
Динамический Label для динамической формы... Arkuz Общие вопросы Delphi 8 25.09.2007 00:03