Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
BabyRooJr
0 / 0 / 0
Регистрация: 20.02.2018
Сообщений: 9
1

Указатель на строку неизвестного размера

28.02.2018, 22:59. Просмотров 144. Ответов 3
Метки нет (Все метки)

Доброго времени суток. Возник вопрос при работе с символьными массивами. Если имеется указатель на символьный тип и при помощи scanf() вводится строка,сколько доступно места для ввода символов, и как можно с помощью malloc зарезервировать память под символьный массив.
C++
1
2
3
4
5
6
7
8
#include<stdio.h>
 
int main()
{
    char *str1 = (char*)malloc(sizeof(char)), *str2;
    scanf("%s",str1); scanf("%s",str2);
    printf("%s\n%s",str1,str2);
}
тут почему то оба массива заполняются до какого то момента..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2018, 22:59
Ответы с готовыми решениями:

Массив неизвестного размера+функция
Алоха, имею такой вопрос вот у меня ниже код, который считает среднее...

Указатель на строку в структуре
Ахой, товарищи. Имею такой вопрос дана структура struct naww { char...

Исправить функцию, возвращающую указатель на строку
Здравствуйте, не подскажите, как нужно подправить код? char* GetString() {...

Не удается поместить строку или получить указатель
В следующую структуру мне необходимо положить размер и указатель на область...

В матрице А размера 5*5 найти строку с наименьшим произведением элементов
В матрице А размера 5*5 найти строку с наименьшим произведением элементов....

3
palva
3120 / 2249 / 453
Регистрация: 08.06.2007
Сообщений: 8,171
Записей в блоге: 4
28.02.2018, 23:12 2
C++
1
str1 = (char*)malloc(sizeof(char));
Здесь для массива вы выделили один байт памяти. Надо указать какое-то реальное количество, 100, например.
Цитата Сообщение от BabyRooJr Посмотреть сообщение
сколько доступно места для ввода символов
Оно ничем не ограничено. Сколько символов введете с консоли, столько и запишется. И нулевой байт в конце добавится.
0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,483
28.02.2018, 23:20 3
Цитата Сообщение от BabyRooJr Посмотреть сообщение
ут почему то оба массива заполняются до какого то момента.
Хуже того! Если это и работает, то по чистой случайности. В первом случае символы пишутся в кучу (динамическую память) начиная с адреса, возвращённого malloc и занимают память, считающуюся свободной. Другими словами если после этого снова с помощью malloc выделить какой-то участок памяти и чем-либо его заполнить, вполне возможно, часть строки будет затёрта. Во втором случае строка пишется по какому-то случайному адресу (переменная str2 ничем не инициализирована), и так же по случайности не вызывает аварийного сбоя. Если бы со значением, оказавшимся в str2 повезло чуть меньше, получили бы ошибку времени выполнения.
Выход: резервировать заведомо достаточный участок памяти и ограничивать количество вводимых символов не забывая, что и терминальный 0 должен в этот участок поместиться:
C
1
2
3
4
5
6
7
8
9
10
11
char * s = malloc(256);
if ( ! s ) {
  // ошибка выделения памяти
  // лучше приучить себя всегда проверять значения, возвращаемые функциями
  // и должным образом на них реагировать
}
if ( scanf("%255s", s) != 1 ) {
  // ошибка чтения, scanf возвращает количество удачно присвоенных значений,
  // в данном случае при удачном выполнении должна 1 вернуть
}
...
Другой вариант - создать динамически расширяемый массив (в стандартной библиотеке такого нет, есть в GLib к примеру), читать из потока по символу в этот массив и увеличивать его по мере надобности. Примеры такого подхода есть здесь, на форуме. Точно знаю, пару раз и сам такой выкладывал.

Добавлено через 1 минуту
Цитата Сообщение от palva Посмотреть сообщение
Оно ничем не ограничено. Сколько символов введете с консоли, столько и запишется.
Вопрос - куда запишется, если выделить недостаточно памяти. И да, "оно" ограничено, если scanf правильно использовать.
1
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
01.03.2018, 07:32 4
Scanf() для строки любого размера
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2018, 07:32

Используя указатель, проверить, входит ли в исходную строку комбинация символов "01"
В исходной строке, используя указатель, проверить, входит ли в нее комбинация...

В матрице А размера m*n сдвинуть строки вверх на одну и поставить первую строку на место последней
Написать и протестировать функцию для решения следующей задачи. В матрице А...

Почему нельзя двумерный массив преобразовывать в указатель на указатель?
Имеем массив: int daytab; при передаче его в функции количество столбцов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru