函数的隐式声明 // createString 函数的问题

问题描述 投票:0回答:1

嘿伙计们,我需要你的帮助。我正在学习两天后的 C 考试。为此,我为一个简单的列表编写了一些代码。 我的问题是我每次都会遇到同样的错误:“函数‘copyString’的隐式声明”。你能告诉我我犯了什么错误吗?

在德国我们说:“Liebe Grüße”

    #include <stdio.h>
    #include <stdlib.h> 
    #include <string.h>

    struct listen{
        int id; 
        int wert; 

        char *namen; 
        char *strasse; 
        int plz;

        struct listen *next; 
    }; 

    typedef struct listen elem; 

    elem *createElem(int id, int wert){

        elem* newElem = (elem*)malloc(sizeof(elem)); 

        if(newElem == NULL) printf("War nischt!"); 

        newElem->id = id; 
        newElem->wert = wert; 
        newElem->namen = NULL; 
        newElem->strasse = NULL; 
        newElem->plz = 0;

        return newElem;  

    }

    int stringLen(char* len){
        int d=0; 

        while(*len++) d++; 

        return d; 
    }
    
    char *createStr(char* st)
    {
        char* newSt;
        
        newSt = (char*)malloc(stringLen(st)+1);

        if(newSt == NULL) {printf("Fehler");};

        copyString(st, newSt); 

        return newSt;  
    }
    
    void copyString(char *von, char *nach)
    {
        while(*von!='\0')
        {
            *nach=*von; 

            *von++; 
            *nach++; 
        }

        *nach = '\0'; 
    }
    
    elem* addToList(elem *list, int wert, char* namen, char* strasse, int plz)
    {

        elem* p = createElem(list->id, wert); 

        p->namen = createStr(namen); 
        p->strasse = createStr(strasse); 
        p->plz = plz; 

        list->id++;
        p->next = list->next; 
        list->next = p;  

        return list; 
    }

    elem* createList(){

        elem* liste = createElem(0, 0); 

        return liste; 
    }

    void PrintElem(Elem *E)
    {
    printf("ID: %d | Wert: %d | Name : %s | Strasse: %s | PLZ: %d", E->id, E->wert, E->namen, E->strasse, E->plz); 
    }

    void printList(elem* list){

        printf("Liste:"); 
        while(list->next != NULL)
        {
            printElem(list->next); 
            list = list->next; 
        }
    }

    int main(){

        elem* Liste01 = createList(); 

        Liste01 = addToList(Liste01, 4, "Peter", "Lustigweg", 15834); 

        printList(Liste01);

        return 0;  
    }

我尝试重新排列声明的函数。

c list function struct implicit
1个回答
0
投票

我试过你的代码,正如上面好的评论中所指出的,“copyString”函数需要在“createStr”函数中使用之前移动。一旦我执行了那一点重构,我就能够编译程序并执行程序。但是,查看代码时,我对它遍历列表结构有一些疑问。很明显,这个链表中有两个元素;但是,只打印了第二个列表元素。而且,元素 ID 似乎没有转到其预期的列表元素。然后我在链表打印函数中添加了一些额外的代码,以便可以查看初始链表元素。以下是您的代码的重构版本。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct listen
{
    int id;
    int wert;

    char *namen;
    char *strasse;
    int plz;

    struct listen *next;
};

typedef struct listen elem;

void copyString(char *von, char *nach)
{
    while(*von!='\0')
    {
        *nach=*von;

        *von++;
        *nach++;
    }

    *nach = '\0';
}

elem *createElem(int id, int wert)
{
    elem* newElem = (elem*)malloc(sizeof(elem));

    if(newElem == NULL) printf("War nischt!\n");

    newElem->id = id;
    newElem->wert = wert;
    newElem->namen = NULL;
    newElem->strasse = NULL;
    newElem->plz = 0;

    return newElem;
}

int stringLen(char* len)
{
    int d=0;

    while(*len++) d++;

    return d;
}

char *createStr(char* st)
{
    char* newSt;

    newSt = (char*)malloc(stringLen(st)+1);

    if(newSt == NULL)
    {
        printf("Fehler\n");
    }

    copyString(st, newSt);

    return newSt;
}

void addToList(elem *list, int wert, char* namen, char* strasse, int plz)   /* FYI - made this a void function as the linked list pointer is already known and doesn't change */
{
    elem* p = createElem(list->id, wert);

    p->namen = createStr(namen);
    p->strasse = createStr(strasse);
    p->plz = plz;

    list->id++;
    p->next = list->next;
    list->next = p;

    return;
}

elem* createList()
{
    elem* liste = createElem(0, 0);

    return liste;
}

void printElem(elem *E)
{
    printf("ID: %d | Wert: %d | Name : %s | Strasse: %s | PLZ: %d\n", E->id, E->wert, E->namen, E->strasse, E->plz);
}

void printList(elem* list)
{
    printf("Liste:");
    printf("Data within initial list element\n");   /* Just to illustrate that the initial list element is not used */
    printElem(list);
    while(list->next != NULL)
    {
        printElem(list->next);
        list = list->next;
    }
}

int main()
{
    elem* Liste01 = createList();

    addToList(Liste01, 4, "Peter", "Lustigweg", 15834);

    printList(Liste01);

    return 0;
}

有了额外的打印信息,以下是终端的输出。

@Vera:~/C_Programs/Console/DeutschList/bin/Release$ ./DeutschList 
Liste:Data within initial list element
ID: 1 | Wert: 0 | Name : (null) | Strasse: (null) | PLZ: 0
ID: 0 | Wert: 4 | Name : Peter | Strasse: Lustigweg | PLZ: 15834

可以看出,添加第二个链表元素时,ID值存储在初始链表元素内;然而,其他数据元素进入下一个链表元素。

我将留给您改进代码,以便初始链表元素包含初始数据,但看看这是否会推动您本着项目的精神前进。

© www.soinside.com 2019 - 2024. All rights reserved.