Форум Фотогалерея Деловой мир Мелитополя
Мелитополь
Мелитопольский форум
 
 RSS  FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Массив строк на C

 
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Вс Ноя 12, 2006 20:21 pm    Заголовок сообщения: Массив строк на C Ответить с цитатой

Кто знает как реализовать массив строк на C ? Догадываюсь что нужно использовать двойные указатели;

Код:
char **str_array;


Не получилось у меня этот массив заполнить (Segmentation fault). задачу решил использованием средств C++;
Код:
std::vector<std::string> str_array;

Но все же интересно как это реализовать средствами C.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Вс Ноя 12, 2006 22:29 pm    Заголовок сообщения: Ответить с цитатой

Если ты знаешь какой будет максимальная длинна строки и количество строк, то можно сделать следующее:
Код:
#include <stdio.h>
#define M 10 //количество строк
#define N 256 //максимальная длинна строки

void main()
{
    char str[M][N];
    for(int i=0;i<10;i++)
    {
        strcpy(str[i],"Hello from Varvar!");
        printf("%s",str[i]);
    }
}


Если же не известно сразу количество строк и количество символов в них то можно сделать так:
Код:
#include <stdio.h>
void main()
{
    char **str;//Предположим, что строки у нас не будут превышать 256 символов
    int count=0;int chars=0;
    prinf("Введите количество строк: ");
    scanf("%d",&count);
    prinf("Введите количество символов в строке: ");
    scanf("%d",&chars);
    str=new char*[count];//указываем число строк
    for(int i=0;i<count;i++)
    {
        str[i]=new char[chars];//выделяем память для каждой строки
    }
    for(int i=0;i<count;i++)
    {
        strcpy(str[i],"Hello from Varvar!");
        printf("%s",str[i]);
    }
    delete[]str;//обязательно очистить память
}

Надеюсь это то что тебе нужно.
PS: Какие визуальные среды рулять в никсах?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Вс Ноя 12, 2006 23:21 pm    Заголовок сообщения: Ответить с цитатой

А можно второй пример только в ANSI C ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Пн Ноя 13, 2006 00:27 am    Заголовок сообщения: Ответить с цитатой

Thomas писал(а):
А можно второй пример только в ANSI C ?

Не понял, что ты имеешь ввиду?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пн Ноя 13, 2006 00:41 am    Заголовок сообщения: Ответить с цитатой

Varvar писал(а):
Thomas писал(а):
А можно второй пример только в ANSI C ?

Не понял, что ты имеешь ввиду?

http://en.wikipedia.org/wiki/ANSI_C
Я попросил написать в стандарте C. А то что ты написал этому не соотвествует никак. тоесть при компиляции куча ошибок. ИМХО ты билдер используешь. Там есть компилятор ANSI C его просто нужно выбрать и попробовать скомпилить.
Кстати лучше всего писать на ANSI C так как это обеспечивает кроссплатформенность кода
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Пн Ноя 13, 2006 01:10 am    Заголовок сообщения: Ответить с цитатой

Thomas писал(а):
Varvar писал(а):
Thomas писал(а):
А можно второй пример только в ANSI C ?

Не понял, что ты имеешь ввиду?

http://en.wikipedia.org/wiki/ANSI_C
Я попросил написать в стандарте C. А то что ты написал этому не соотвествует никак. тоесть при компиляции куча ошибок. ИМХО ты билдер используешь. Там есть компилятор ANSI C его просто нужно выбрать и попробовать скомпилить.
Кстати лучше всего писать на ANSI C так как это обеспечивает кроссплатформенность кода

Извени, не проверял код. Навскидку писал. Исправленный код, работающий в ANSI_C:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char **str;//Предположим, что строки у нас не будут превышать 256 символов
    int count=0;int chars=0;
    printf("Введите количество строк: ");
    scanf("%d",&count);
    printf("Введите количество символов в строке: ");
    scanf("%d",&chars);
    str=new char*[count];//указываем число строк
    for(int i=0;i<count;i++)
    {
   str[i]=new char[chars];//выделяем память для каждой строки
    }
    for(i=0;i<count;i++)
    {
   strcpy(str[i],"Hello from Varvar!");
   printf("%s",str[i]);
    }
    delete[]str;//обязательно очистить память
    return 0;
}

Или это тоже не то. В каком редакторе ты пишешь. Посоветуй для линуха визуальные средства.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пн Ноя 13, 2006 02:04 am    Заголовок сообщения: Ответить с цитатой

то что ты цикл изменил это я увидел. Меня болише интересует момент
Код:
new char[chars]

не знаю какие там у вас компиляторы ANSI C, но то что тобой написано в жизни не должно было запустится.
Что такое оператор new в C такого нет, а вот в C++ есть.
по поводу delete тоже.
насколько я знаю в C надо так:
http://ru.wikipedia.org/wiki/Malloc
Главное понял в чем хоть я ошибся Rolling Eyes
Varvar thanks.
Код:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char **str;
    int count=10;//int chars=200;
    str=(char **)malloc(0); // вот тут я и протупил ранее надо было указать начало строки в памяти
    int i=0;
    for(i=0;i<count;i++)
    {
        char greeting[]="Hello from Thomas!\nlong text here:\n \
        Because of the functions being performed on the rows, this type of query cannot benefit from an index. \
        This means that the entire table will have to be scanned to find matches to user 8. \
        However, as this is a bitwise operation, it should be quite efficient in spite of the full table scan \
        (I was able to perform this operation on a randomly generated table of 500,000 rows and have 250,000 \
        rows returned in 1.89 seconds on my 1.6 Ghz PC).\n\n";

        str[i]=(char *)malloc(strlen(greeting)*sizeof(char));
        strcpy(str[i],greeting);
        printf("%s",str[i]);
    }
    free(&str);
    return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Пн Ноя 13, 2006 20:05 pm    Заголовок сообщения: Ответить с цитатой

Thomas, мне кажеться или ты неправильно освобождаешь память
Код:
 free(&str);

В free нужно передать указатель. Зачем же передавать указатель на указатель &str, помоему нужно просто предать str.
Напиши, какую среду ты использовал и компилятор.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пн Ноя 13, 2006 20:42 pm    Заголовок сообщения: Ответить с цитатой

Varvar писал(а):
Thomas, мне кажеться или ты неправильно освобождаешь память
Код:
 free(&str);

В free нужно передать указатель. Зачем же передавать указатель на указатель &str, помоему нужно просто предать str.
Напиши, какую среду ты использовал и компилятор.

Среда - текстовый редактор mc Smile
компилятор: gcc
OS : ASPLinux
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Пн Ноя 13, 2006 20:45 pm    Заголовок сообщения: Ответить с цитатой

И еще одно:
Здесь ты не выделяешь память!
Код:
str=(char **)malloc(0); // вот тут я и протупил ранее надо было

Нужно так:
Код:
str=(char **)malloc(count*sizeof(char*));

- Так будет правильнее, ато ты лезешь в чужой участок памяти
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пн Ноя 13, 2006 20:53 pm    Заголовок сообщения: Ответить с цитатой

Varvar писал(а):
И еще одно:
Здесь ты не выделяешь память!
Код:
str=(char **)malloc(0); // вот тут я и протупил ранее надо было

Нужно так:
Код:
str=(char **)malloc(count*sizeof(char*));

- Так будет правильнее, ато ты лезешь в чужой участок памяти

Это lol
Код:
sizeof(char*)
)))
размер указателя что-ли ?
malloc(0) разрешенная весчь и это нормально указывает начало памяти а потом я уже под каждую строку от того места бить начинаю
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Varvar

Писатель


Пол: Пол: Он
Зарегистрирован: 02.11.2006
Сообщения: 400

Репутация: 51.9
голосов: 8

СообщениеДобавлено: Пн Ноя 13, 2006 21:03 pm    Заголовок сообщения: Ответить с цитатой

Thomas писал(а):
Varvar писал(а):
И еще одно:
Здесь ты не выделяешь память!
Код:
str=(char **)malloc(0); // вот тут я и протупил ранее надо было

Нужно так:
Код:
str=(char **)malloc(count*sizeof(char*));

- Так будет правильнее, ато ты лезешь в чужой участок памяти

Это lol
Код:
sizeof(char*)
)))
размер указателя что-ли ?
malloc(0) разрешенная весчь и это нормально указывает начало памяти а потом я уже под каждую строку от того места бить начинаю

По сути дела динамический двумерный массив - это одномерный динамический массив, который указывает на др. динамические массивы, а следовательно тоже имеет размер: количество елементов на размер типа указатель.
Кинь мне ссылку где говориться что можно использовать malloc(0).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пн Ноя 13, 2006 21:12 pm    Заголовок сообщения: Ответить с цитатой

http://lists.freebsd.org/pipermail/freebsd-net/2004-February/002946.html
http://www.opengroup.org/onlinepubs/007908799/xsh/malloc.html
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
neklov
В настоящее время запрещен

Залетный


Пол: Пол: Он
Зарегистрирован: 18.04.2024
Сообщения: 5
Откуда: Запорожье
Репутация: 18.6

СообщениеДобавлено: Чт Апр 18, 2024 11:42 am    Заголовок сообщения: Ответить с цитатой

Как же классно херачить на плюсах и пользоваться векторами, но не всегда помагает))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование Часовой пояс: GMT + 2
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Р: 507253

База отдыха «Белый парус» пгт Кирилловка Азовское море.
AUKRO-RIP.IN.UA Аукро закрылся -рейтинг сохранился!

Рейтинг Мелитопольских сайтов на Melitopol.org Internet Map Hosting by VivaNET