Народ, помогите плз, скажите почему хренов массив db при присваивании каждому последующему индексу значения, всем предыдущим тоже присваивает тоже значение?#include <stdlib.h>
#include <stdio.h>int
main(int argc, char *argv[])
{
FILE *fp;
static char word[10];
char *db[10];
int index_db=0;
int index=0;
char c;fp=fopen ("trafnet.conf", "r");
while ((c = getc(fp)) != EOF) {
if(c=='\n') {
db[index_db++]=word;
index=0;
continue;
}
word[index++] = c;
}
printf("%s\n", db[1]);
}
>Народ, помогите плз, скажите почему хренов массив db при присваивании каждому последующему
>индексу значения, всем предыдущим тоже присваивает тоже значение?
>
>#include <stdlib.h>
>#include <stdio.h>
>
>int
>main(int argc, char *argv[])
>{
> FILE
> *fp;
> static char
> word[10];
> char
> *db[10];
> int
> index_db=0;
> int
> index=0;
> char
> c;
>
> fp=fopen ("trafnet.conf", "r");
>
> while ((c = getc(fp))
>!= EOF) {
>
> if(c=='\n') {
>
> db[index_db++]=word;
>
> index=0;
>
> continue;
>
> }
>
> word[index++] = c;
> }
> printf("%s\n", db[1]);
>}что написал, то и получил. У тя все элементы массива указателей всегда на одно и тоже и указывает (на word).
а как сделать чтобы она на содержимое word указывала?, как вообще можно инициализировать символьный массив? ...
>а как сделать чтобы она на содержимое word указывала?, как вообще можно
>инициализировать символьный массив? ...никак, указатель не на содержимое указывает, а на место в памяти. Нужно создать в памяти, записать туда, а потом указатель поставить на эту область. А вообще - читай Керниган, Ричи. Язык Си, там все это есть.
>>Народ, помогите плз, скажите почему хренов массив db при присваивании каждому последующему
>>индексу значения, всем предыдущим тоже присваивает тоже значение?А ещё намного (!) лучше - это общее решение подобного класса задач - это использовать для этого контейнерные классы STL (standard template library), это решение универсальное, эффективное, малотрудоёмкое... вполне стоит затрат на то, чтоб один рах потратить время на освоение STL. STL в едином виде существует практически для всех OS.
Правда - это всё для C++.
Учи malloc, free, new, delete.А что б твой пример быстро заработал (на строках длиной<10 символов) достаточно заменить строку:
> db[index_db++]=word;
на:
word[index]='\0';
db[index_db++]=strcpy(word);Конечно, после использования массива, не забудь освободить память (free)
народ, а я так реализовал? сильно ли это противоречит правилам Си?FILE *fp;
static char word[100][100];
static char *db[100];
int index_j=0;
int index_i=0;
char c;while ((c = getc(fp)) != EOF) {
if(c=='\n') {
db[element++]=word[index_i];
index_j=0;
index_i++;
continue;
}
word[index_i][index_j++] = c;
}
>народ, а я так реализовал? сильно ли это противоречит правилам Си?
1. А на хрена тебе в этом коде массив db?
2. Все строки по "правилам Си" лучше заканчивать нулевым символом (иначе как размер строки узнаешь, смотри в предыдущем моем примере присвоение '\0')А лучше всего почитай книжку умную про строки и динамическую память.
>Учи malloc, free, new, delete.
>
>А что б твой пример быстро заработал (на строках длиной<10 символов) достаточно
>заменить строку:
>
>> db[index_db++]=word;
>на:
> word[index]='\0';
> db[index_db++]=strcpy(word);А ещё точнее = strdup( word ) - strcopy() только копирует содержимое в уже размещённую память, и, скорее всего закончится core dump...
да но тут мне еще придется очищать массив word, перед следующим его заполнением...
>>Учи malloc, free, new, delete.
>>
>>А что б твой пример быстро заработал (на строках длиной<10 символов) достаточно
>>заменить строку:
>>
>>> db[index_db++]=word;
>>на:
>> word[index]='\0';
>> db[index_db++]=strcpy(word);
>
>А ещё точнее = strdup( word ) - strcopy() только копирует содержимое
>в уже размещённую память, и, скорее всего закончится
Опечатался :) конечно strdup
хорошо, пока сделал с 2х мерным массивом, работает, но хочу переделать с использованием malloc, тут принцип, какой? создаю массив указателей, выделяю память для одной строки, присваиваю полученный указатель первому элементу массива, выделяю второй блок памяти, указатель присваиваю второму элементу массива и так далее для всех строк?
Исправленная версия:#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main (int argc, char *argv[])
{
FILE *fp;
static char word[10];
char *db[10];
int index_db = 0;
int index = 0;
char c;fp = fopen ("trafnet.conf", "r");
memset (db, 0, 10);
*word = 0;while ((c = getc(fp)) != EOF)
{
if (c == '\n')
{
word[index]=0;
if (index_db < 9) {
db[index_db++] = strdup (word);
}
else {
break;
}
index=0;
continue;
}
if (index < 9) {
word[index++] = c;
}
}
printf ("%s\n", db[1]);
..........
// очистка
for (index_db = 0; index_db < 10; index++)
{
if (db[index_db]) {
free (db[index_db]);
}
}
}
я так сделал, так нормально?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main (int argc, char *argv[])
{
FILE *fp;
static char word[100];
char *db[100];
int index_db = 0;
int index = 0;
char c;fp=fopen ("/c/trafnet/trafnet.conf", "r");
while ((c = getc(fp)) != EOF) {
if(c=='\n') {
db[element++]=word[index_i];
index_j=0;
index_i++;
continue;
}
word[index_i][index_j++] = c;
}
Тебе что ли нужно в память файл построчно зачитать ?
Помоему проще будет загонять в "char **db" без промежуточных "word". Что-то типа:int i=0;
char **db=(char **)malloc(STRING_COUNT*sizeof(char *));
bzero(db,STRING_COUNT*sizeof(char *));while (! feof(fp)) {
db[i]=(char *)malloc(MAX_LEN+1);
bzero(db[i],MAX_LEN+1);
fgets(db[i++],MAX_LEN,fp);
};
где MAX_LEN - максимальная длина строки, STRING_COUNT - максимальное количество строк. Если использовать realloc(...), то можно отойти от этих ограничений.PS. bzero сделано на всякий случай, дабы переполнения небыло.
Да, надо файл построчно,
но только чтобы в конце строки небыло '\n', а то MySQL не принемает потом все ити строки как пароль, имя хоста и юзера ))
Тогда поправка. Вставляется после fgets:if ((strlen(db[i-1]) != 0) && (db[i-1][strlen(db[i-1])-1] == '\n'))) db[i-1][strlen(db[i-1])-1]='\0';
Или во такая строка:
if (strchr(db[i-1],'\n')) *strchr(db[i-1],'\n')='\0';
фух )) дай бог помощи переварить теперь это )) в моей голове еще путаются понятия указателей ))