Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема со строками и указателями на строки. Язык С

12K
15 сентября 2006 года
Apelsin
21 / / 06.07.2006
Проблема такая: Берется файл из него берется начала каждой строки все это в цикле.
Код:
int main()
{
    FILE *fp;
    char *line;
    list *head;

    head = (list*)malloc(sizeof(list));
    line = (char*) malloc(255);
       
    if ((fp = fopen("passwd", "r")) != NULL) {
       
        line=fgets(line, 255, fp);
        strtok(line,":");
        head->data = line;
        head->link = NULL;
        do
        {
            line=fgets(line, 255, fp);
            strtok(line,":");
            add_spisok(head,line);
            //printf("%s\n", line);
        }
        while (line);
        printf("---------------------------------------------");
        fclose(fp);
        print_spisok(head);
    } else
    {
        printf ("can not open file");
    };
}

Потом указатель line нужно запихнуть в список(add_spisok).
Проблема как раз в том, что все элементы списка указывают на последнию строчку.
Тут я разобрался в чем ошибка.
структура элемента списка
 
Код:
typedef struct _list {
    struct _list *link;
    char *data;
}list;

нужно сделать просто char data[255];

Но тогда как в эту data записать то на что ссылается указатель line?







на всякий случай вся прога:
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct _list {
    struct _list *link;
    char *data;
}list;

list *find_end(list *head)
{
    list *id;
    for(id=head; id->link != NULL; id=id->link);
    return id;
}

void add_spisok(list *head, char *value)
{
    list *prev, *newid;
    prev = find_end(head);
    newid = (list*)malloc(sizeof(list));
    newid->link = NULL;
    newid->data = (char*) malloc(255);
    newid->data = value;
    prev->link = newid;
}

void print_spisok(list *head)
{
    list *id;

    for(id = head; id->link != NULL; id=id->link)
    {
        printf("%s\n", id->data);
    };
}

int main()
{
    FILE *fp;
    char *line;
    list *head;

    head = (list*)malloc(sizeof(list));
    line = (char*) malloc(255);
       
    if ((fp = fopen("passwd", "r")) != NULL) {
       
        line=fgets(line, 255, fp);
        strtok(line,":");
        head->data = line;
        head->link = NULL;
        do
        {
            line=fgets(line, 255, fp);
            strtok(line,":");
            add_spisok(head,line_put);
            //printf("%s\n", line);
        }
        while (line);
        printf("---------------------------------------------");
        fclose(fp);
        print_spisok(head);
    } else
    {
        printf ("can not open file");
    };
    int iTask;
    scanf("%i", &iTask);
}
3.0K
15 сентября 2006 года
Мerlin
267 / / 25.07.2006
Код:
void add_spisok(list *head, char *value)
{
  list *prev, *newid;
  prev = find_end(head);
  newid = (list*)malloc(sizeof(list));
  newid->link = NULL;
  newid->data = strdup(value);
  prev->link = newid;
}

int main()
{
  FILE *fp;
  char *line;
  list *head;
       
  if ((fp = fopen("C:\\passw", "r")) != NULL) {
    head = (list*)malloc(sizeof(list));
    line = fgets(line, 255, fp);
    strtok(line,":");
   head->data = strdup(line);
   head->link = NULL;
...
Кроме этого перед вызовом add_spisok() нужно бы проверить равна ли list NULL. Так как, теперь ты добавляешь один лишний элемент.
И если в программе выделяется память ф-ей malloc(), тогда желательно освободить эту память ф-ей free().
12K
15 сентября 2006 года
Apelsin
21 / / 06.07.2006
Ясно спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог