char [] to char * в структуре - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь получить char [] для char * в структуре, когда я назначаю его p->name2=name, он показывает мне правильное слово, но когда я пытаюсь go через связанный список с для l oop, это только показывает мне последнее слово столько раз, сколько слов в файле. почему это происходит? И я не могу использовать строку или библиотеки. Мне действительно нужно получить каждое слово как символ символа (getchar ())?

#include<iostream>
#include<fstream>
using namespace std;
struct elem{
    char* name2;
    elem* next;
};
int main(){
    elem *first = NULL, *last = NULL,*q=NULL, *p;
    fstream fin,fout;
    char name[255];
    fin.open("pasts.txt",ios::in);
    fin>>name;
    while (fin){
        p = new elem;
        p->next=NULL;
        p->name2=name;
        if(first==NULL){
            first=last=p;
        }
        else{
            p->next=last;
            last=p;
        }
        fin>>name;
    }
    fin.close();
    for(p=last;p!=NULL;p=p->next){
        cout<<p->name2<<" ";
    }

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

И я не могу использовать строки или библиотеки.

Обычно это означает: инструктор запрещает их использование. Это нормально. Но я просто хочу уточнить, что из-за этого ответ будет указывать на неоптимальное решение.

Итак, у вас есть несколько вариантов:

Вариант 1: Использовать массив.

struct elem{
    char name2[256];

Затем вам нужно ввести имя в name2. И будьте осторожны, чтобы не переполниться.

Вариант 2. Использование динамической памяти c.

l = strlen(name);
name2 = new char[l + 1];
//strcpy
//and deal with delete[] later on.

Вариант 3. В любом случае используйте std :: string и попытайтесь обучить инструктора. YMMV.

0 голосов
/ 30 апреля 2020

Вы объявили локальную переменную name, имеющую тип массива

char name[255];

В этом выражении

p->name2=name;

член данных name2 всех выделенных узлов указывает на один и тот же первый символ массива символов name.

Так что в этом массиве хранится то, на что указывает элемент данных name2 всех узлов.

Вы должны сделать копию сохраненного строка в массиве name путем динамического выделения ему памяти и присвоения ее адреса элементу данных name2.

Вы можете сделать это следующим образом

    p->name2 = new char[strlen( name ) + 1];
    strcpy( p->name2, name );
...