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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2010, 23:46   #1
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию Строки неизвестной длины в си

Хочу составить одну строку из нескольких односимвольных строк, причём количество строк становится известно только в ходе выполнения функции.
Делаю таким образом. Выделяю диапазон памяти для переменной info, равный сумме размеров строк. history_p - переменная, в которой определяется, сколько символов будет записано:

Код:
	char buf[3];
	char *info;
	info = (char*)malloc((31 + history_p)*sizeof(char));
	info = "";

	file = fopen("save.dat", "w");

	sprintf(buf, "%d%d", 1, 2);
	strcat(info, buf);
Вылетает на последней строчке. В чём причина?
abr_question вне форума Ответить с цитированием
Старый 21.01.2010, 00:17   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от abr_question Посмотреть сообщение
Хочу составить одну строку из нескольких односимвольных строк, причём количество строк становится известно только в ходе выполнения функции.
Делаю таким образом. Выделяю диапазон памяти для переменной info, равный сумме размеров строк. history_p - переменная, в которой определяется, сколько символов будет записано:

Код:
	char buf[3];
	char *info;
	info = (char*)malloc((31 + history_p)*sizeof(char));
	info = "";

	file = fopen("save.dat", "w");

	sprintf(buf, "%d%d", 1, 2);
	strcat(info, buf);
Вылетает на последней строчке. В чём причина?
Может, не учел символ конца строки?
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 21.01.2010, 00:35   #3
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Если я тебя правильно понял, то нет, явно не в нём. Ведь я резервирую память для info, как минимум под 31 + N символов, а в первой строке сцепляю info и buf, в который помещено всего 2 символа.

Кажется, заработало с такой конструкцией:
Код:
	char info[31 + history_p];
	//info = (char*)malloc((31 + history_p)*sizeof(char));
	//info = "";

	sprintf(buf, "%d%d", 1, 1);
	strcat(info, buf);
Однако всё же непонятно, почему не заработало с malloc. Кто-нть может подсказать? Может, всё же первый вариант еффективнее второго?

Последний раз редактировалось Stilet; 21.01.2010 в 12:17.
abr_question вне форума Ответить с цитированием
Старый 21.01.2010, 12:02   #4
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Попробуй так.

Код:
	char buf[3];
	char *info;
	info = (char*)malloc((31 + history_p)*sizeof(char));
	strcpy(info,"");

	file = fopen("save.dat", "w");

	sprintf(buf, "%d%d", 1, 2);
	strcat(info, buf);
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 21.01.2010, 16:19   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от abr_question Посмотреть сообщение
Хочу составить одну строку из нескольких односимвольных строк, причём количество строк становится известно только в ходе выполнения функции.
Делаю таким образом. Выделяю диапазон памяти для переменной info, равный сумме размеров строк. history_p - переменная, в которой определяется, сколько символов будет записано:

Код:
	char buf[3];
	char *info;
	info = (char*)malloc((31 + history_p)*sizeof(char));
	info = ""; // Этого быть не должно! Это Вам не Паскаль :-\

	file = fopen("save.dat", "w");

	sprintf(buf, "%d%d", 1, 2);
	strcat(info, buf); // перед вызовом этой ф-ции напишите info[0] = 0 или вместо strcat используйте strcpy
Вылетает на последней строчке. В чём причина?
Ошибки у Вас.
И почему бы не делать так:
Код:
sprintf(info, "%d%d", 1, 2);
?

Последний раз редактировалось netrino; 21.01.2010 в 16:22.
netrino вне форума Ответить с цитированием
Старый 21.01.2010, 16:27   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Сообщение от abr_question Посмотреть сообщение
Кажется, заработало с такой конструкцией:
Код:
	char info[31 + history_p];
	//info = (char*)malloc((31 + history_p)*sizeof(char));
	//info = "";

	sprintf(buf, "%d%d", 1, 1);
	strcat(info, buf);
Такая конструкция вообще не должна компилироваться. Потому что в статической памяти можно резервировать массив раземрность которого константна.
MaTBeu вне форума Ответить с цитированием
Старый 21.01.2010, 18:22   #7
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от nazavrik Посмотреть сообщение
Попробуй так.

Код:
	char buf[3];
	char *info;
	info = (char*)malloc((31 + history_p)*sizeof(char));
	strcpy(info,"");

	file = fopen("save.dat", "w");

	sprintf(buf, "%d%d", 1, 2);
	strcat(info, buf);
Спасибо! Вот так заработало!

Цитата:
Сообщение от netrino Посмотреть сообщение
Ошибки у Вас.
И почему бы не делать так:
Код:
sprintf(info, "%d%d", 1, 2);
?
Для инициализации можно и так, просто потом в конец info нужно будет добавлять строчки, а sprintf затирает прежние данные переменной.

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Такая конструкция вообще не должна компилироваться. Потому что в статической памяти можно резервировать массив раземрность которого константна.
Скорее всего потом перепишу, как nazavrik сказал.
Но прога компилится - и ето факт. Вроде как в статьях за 2008-2009 годы писалось, что ето что-то типа стандарта POSIX и к нему приводятся компиляторы. Хотя, видел краем глаза, утверждать не буду.
abr_question вне форума Ответить с цитированием
Старый 21.01.2010, 18:31   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от abr_question Посмотреть сообщение
Для инициализации можно и так, просто потом в конец info нужно будет добавлять строчки, а sprintf затирает прежние данные переменной.
Скорее всего потом перепишу, как nazavrik сказал.
Так лучше не надо, если хотите этот эффект, то просто напишите, как я указал в комментариях
Код:
info[0] = '\0';
Это быстрее, и,имхо, нагляднее )
Ну а вообще не вижу смысла использовать strcat чтобы заполнить пока ещё пустую строку
netrino вне форума Ответить с цитированием
Старый 21.01.2010, 18:32   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Скорее всего потом перепишу, как nazavrik сказал.
Но прога компилится - и ето факт. Вроде как в статьях за 2008-2009 годы писалось, что ето что-то типа стандарта POSIX и к нему приводятся компиляторы. Хотя, видел краем глаза, утверждать не буду.
В стандартах такого нет. А какой у вас компилятор?
MaTBeu вне форума Ответить с цитированием
Старый 21.01.2010, 18:35   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
В стандартах такого нет. А какой у вас компилятор?
такое есть в стандарте C99, массивы переменной длинны
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как взять со строки неизвестной длины n первых символов? :) peq Microsoft Office Excel 2 07.01.2010 22:40
Считывание строки неограниченной длины (Си) 0kopok Помощь студентам 6 05.10.2009 20:46
Pascal - Задано число n неизвестной разрядности. Вычислить сколько цифр в этом числе Виолетта Помощь студентам 2 18.03.2009 07:17
Нахождение неизвестной Sam86 Microsoft Office Excel 5 16.09.2008 19:39