【问题标题】:char[] to char* in struct结构中的 char[] 到 char*
【发布时间】:2020-08-14 03:01:08
【问题描述】:

我试图在 struct 中将 char[] 转换为 char*,当我将其分配给 p->name2=name 时,它会显示正确的单词,但是当我尝试使用 for 循环遍历链表时,它只会显示最后一个单词文件中有多少单词。为什么会发生?而且我不能使用字符串或库。我真的需要将每个单词作为字符符号(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<<" ";
    }

【问题讨论】:

  • std::string 旨在避免此类问题。
  • 是的!您必须复制 实际字符,否则您的所有节点都会有一个指向 same 字符串的name2 值。 (几乎可以肯定有一个副本与此非常接近,所以我没有发布答案。)
  • char name[255]; 是一个变量。 char* name2; 在您的所有节点中都指向此变量。如果一个节点改变了变量,所有节点看到的都是一样的,因为它们是一样的。
  • 您正在使用 C++,但您正在编写 C(因为您正在使用原始指针和字符缓冲区)。使用std::string!

标签: c++ struct char


【解决方案1】:

您声明了具有数组类型的局部变量name

char name[255];

在此声明中

p->name2=name;

所有已分配节点的数据成员name2指向字符数组name的同一个第一个字符。

那么这个数组中存储的是所有节点的数据成员name2所指向的内容。

您必须通过动态分配内存并将其地址分配给数据成员name2 来复制数组name 中存储的字符串。

你可以这样做

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

【讨论】:

    【解决方案2】:

    而且我不能使用字符串或库。

    通常这意味着:教练禁止使用这些。没关系。但我只是想澄清一下,正因为如此,答案将指向一个次优的解决方案。

    所以,您有多种选择:

    选项 1:使用数组。

    struct elem{
        char name2[256];
    

    然后,您需要将名称 strcpy 转换为 name2。并且注意不要溢出。

    选项 2:使用动态内存。

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

    选项 3:无论如何都使用 std::string 并尝试教育讲师。 YMMV。

    【讨论】:

    • 如果您要使用像 strlen 这样的库函数(不允许使用 OP),那么 strdup 将是可行的方法,恕我直言。
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2012-10-24
    • 1970-01-01
    • 2021-12-12
    • 2015-06-29
    • 2016-02-12
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多