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;
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);
}
#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);
}
Код:
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;
...
{
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;
...
И если в программе выделяется память ф-ей malloc(), тогда желательно освободить эту память ф-ей free().
Ясно спасибо