• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Запись в строку

  • Автор темы vani2
  • Дата начала
V

vani2

Как записать в строку s посимвольно?
Описание char *s,c.
Под s нужно динамически выделять память при этом?
Заранее благодарен.
 
L

lazybiz

Выделение памяти:
C++:
char *s;
s = new char [1024];

Запись посимвольно:
C++:
s[0] = 'a';
...
s[1023] = 'b';
 
V

vani2

Спасибо, lazybiz. А как это будет выглядеть на С? new char заменить на malloc?
И еще : я не знаю наперед число символов, так что 1024 нельзя писать)
И как её потом очистить для повторного использования. Использую С ANSI.
 
E

ensane

C++:
#include <stdlib.h>
...
size_t size = 1;
char s* = (char *)malloc(size*sizeof(char));//выделяем память для первого символа
...
char c='a';
...
s[size]=c;
size++;
s* = (char *)realloc(s, size*sizeof(char));//добавляем немножко памяти
...
free(s);//чистим за собой.
Работает медленно (относительно), зато использует минимум памяти.
 
L

lazybiz

ensane
C++:
char s* = (char *)malloc(size*sizeof(char));//выделяем память для первого символа
Тут по-моему должно быть:
C++:
char *s = (char *)malloc( size );
У типа char не стоит мерить размер, он всегда равен 1, вне зависимости от компилятора.
И звездочка должна быть перед s во время определения.
 
E

ensane

lazybiz
Да, 1 байт. Но sizeof я добавляю всегда. Вопрос привычки.
 
V

vani2

Выдаёт ошибку incompatible types in assignment

<!--shcode--><pre><code class='с'>s[size]=c;[/CODE]

В чём дело? B)
 
I

ierofant

Как насчёт:
C++:
s[size - 1]=c;
?
Конечно без вашего кода сложно судить... Вы почему-то радуете нас маленькими кусочками.
 
L

lazybiz

vani2
Пока не покажешь код, мы тебе помочь не сможем. Или хотя сделай так, чтобы нам было понятно с чем мы имеем дело.
 
V

vani2

Как выше описано: ошибка на * перед s.

Так в gcc выдаёт warning, но работает.В borland error.

<!--shcode--><pre><code class='c'>char c,*s;[/CODE]
<!--shcode--><pre><code class='c'>while (c!='\x3B') {
*(s+i)=(char*)malloc(sizeof(char));
s=c;
i++;
c=fgetc(d);}[/CODE]
Так error и warning нет, но не работает-считыват непонятно что.

<!--shcode--><pre><code class='c'>while (c!='\x3B') {
s=(char*)calloc(1,sizeof(char));
s=c;
i++;
s=(char*)realloc(s,i*sizeof(char));
c=fgetc(d);}[/CODE]
 
I

ierofant

C++:
*(s+i)=(char*)malloc(sizeof(char));

Вас не смущает, что вы присваиваете типу char указатель на char ?
warning это ведь не просто надоедливая надпись, полезно читать, что там пишется, тогда вы бы и сами эту ошибку нашли.

Добавлено:
C++:
char *ptr = s + 1;
ptr = (char*)malloc(sizeof(char));
 
V

vani2

тогда вы бы и сами эту ошибку нашли.
Я был в замешательстве-программа работала, и я не знал как исправить.

Вот так всё работает без ошибок и предупреждений.Я Вам, ierofant, весьма признателен.
<!--shcode--><pre><code class='c'>while (c!='\x3B') {
ptr=s+1;
ptr=(char*)malloc(sizeof(char));
s=c;
i++;
ptr=(char*)realloc(s,i*sizeof(char));
c=fgetc(d);}[/CODE]
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!