链接列表:从char到char *问题的无效转换

时间:2015-06-11 01:30:12

标签: c++ pointers linked-list

这里似乎有一些类似的问题虽然没有一个有效地工作(至少使用我的实现。)我希望我能得到一些有关我为什么会收到以下错误的见解:

  

从char转换为char * [-f permissive]

无效转换
#include <ctime>
#include <iostream>
#include "SLList.h"

using namespace std;

int main() {

    SLList *newNode;
    char name;
    int id;

    newNode = new SLList;

    for( int a = 0; a < 2; a++ )
    {
       cout << "Type a name: ";
       cin >> name;
       cout << endl << "Type an integer id: ";
       cin >> id;

       newNode->insertFirst(name,id);
    }
    newNode->print();
}

我的课程如下:

    SLList::SLList()
{
    first = NULL;
    last = NULL;
    count = 0;
}

void SLList::print()
{
    cout << "List count: " << count <<endl;
    node *temp;
    temp = first;
    while(temp != NULL)
    {
        cout <<"Name = " <<temp->name <<endl;
        cout <<"ID = " <<temp->id <<endl;
        cout <<"======================" <<endl;
        temp = temp->next;
    }
}
void SLList::insertFirst(char *name, int id)
{
    node *newNode;
    newNode = new node;
    assert (newNode != NULL);
    newNode->name = name;
    newNode->id = id;
    newNode->next = first;
    first = newNode;
    if(last == NULL)
        last = newNode;
    count++;
}

当我使用name&amp;运行主代码时在insertFirst(&amp; name,id)下;

代码运行(不是预期的)但它至少编译,但名称最终对每个代码都相同。我对指针很新,但希望得到一些帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

这一行: newNode-&gt; name = name; 是问题。

我猜你可能想要的不是单个字符,而是名字的字符串。在这种情况下,您要做的是用以下代码替换该行:

strcpy(newNode.name, name);

(别忘了做#include cstring)

现在,请确保您查看strcpy文档并了解它所采用的两个参数及其返回的内容。确保只传递strcpy空终止的c-strings。

这没关系:

char name[6];
strcpy(name, "Grace");  //the compiler makes sure this c string "Grace" has a null terminator

这不行:

char* name1;   //never assigned
char* name2;   //never assigned
strcpy(name1, name2); //strcpy would just copy on into space until it found a null character

您可能会收到警告strcpy已弃用,您可以看到该警告here。但我猜这是针对学校的,所以你可以安全地推迟这样的安全问题,因为黑客可能并不关心你的家庭作业。不推荐使用意味着该功能的新版本已经发布,不建议再使用它了。

现在,我们来谈谈您收到的错误消息: 从char到char *的无效转换

newNode->name; //evaluates to a char.
name;          //evaluates to a char pointer.

newNode->name = name    // is a type mismatch because char != char*

如果不是复制整个字符串,如果你真的只想要一个字符,那么你可以这样做:

newNode.name = name

newNode->name = *name

- &gt;是一个取消引用给它的指针的运算符。 你也可以取消引用这样的指针:* name。

执行此操作:newNode-&gt; name与执行相同的操作:newNode。* name