首页 > 解决方案 > 如何修复在cpp中打印未知符号?

问题描述

我正在尝试打印一个排序列表,它看起来列表本身是正确的——通过打印内部结果,但是当我尝试打印整个列表时,它会显示一些奇怪的符号和崩溃。我哪里错了?这是我在“应用”中调用的函数的主要内容:

#include <iostream>
#include "sortedList.h"
#include "dummy.h"

string getLen(string str)
{
    return std::to_string(str.length());
}

int main() {
    std::cout << "Hello, World!" << std::endl;

    LinkedList <string> myList;
    myList.insert("yosi");
    myList.insert("Rikki");
    myList.insert("Pavel <3");
    cout << "Now printing myList" << endl;
    myList.print();

    LinkedList<string> new_list;
    new_list = myList.apply(myList, getLen);
    cout << "Now printing new_list" << endl;
    new_list.print();

    return 0;
}

这是我的 h 文件:

#include <iostream>
#include <cstring>
#include <string>
#include <functional>

#include "dummy.h"
using namespace std;

#ifndef SORT_H
#define SORT_H

template <class T>
class LinkedList {
    struct Node {
        Node(const T &in) : data(in) {}
        T data;
        Node * next;
    };

    class Iterator
    {
        Node *m_ptr;              // pointer to current node in the list
    public:
        Iterator(Node * node) {
            m_ptr = node;
        }
        Iterator& operator ++ () {
            m_ptr = m_ptr -> next();
            return *this;
        }
        Iterator operator ++ (T) {
            Iterator temp(*this);
            m_ptr = m_ptr -> next();
            return temp;
        }
        bool operator == (const Iterator other) const {
            return m_ptr == other.m_ptr;
        }
        bool operator != (const Iterator other) const {
            return m_ptr != other.m_ptr;
        }
        T& operator * () {
            return m_ptr -> data();
        }
        operator bool() {
            return m_ptr != 0;
        }
    };

    Node * head;

    bool is_in_list(T value){
        Node * curr = head;
        while(curr != nullptr) {
            if (curr->data == value){
                return true;
            } else {
                curr = curr->next;
            }
        }
        return false;
    }


public:
    LinkedList() {
        head = nullptr;
    }
    LinkedList(T value) {
        head = new Node(value);
//        head -> data = value;
//        head -> next = nullptr;
    }

    ~LinkedList() {
        while(head != nullptr) {
            Node * curr = head -> next;
            delete head;
            head = curr;
        }
    }

    void operator = (T &t) {
        head = t.head;
    }

    Node * nodeCopy(Node * head) {
        if (head == nullptr) {
            return nullptr;
        }
        Node * copied_node = new Node(head -> data);
        copied_node -> data = head -> data;
        copied_node -> next = nodeCopy(head -> next);
        return copied_node;
    }

    LinkedList(LinkedList &list){
        head = nodeCopy(list.head);
    }


    template<typename B>
    LinkedList filter(LinkedList &list, B pred) {
        LinkedList <T> new_list(list);
        Node * curr = list.head;
        while (curr) {
            if (!(pred(curr -> data))) {
                new_list.remove(curr -> data);
            }
            curr = curr -> next;
        }
        std::cout << "Getting out of filter" << std::endl;
        return new_list;
    }

    template<typename A>
    LinkedList apply(LinkedList &list, A func) {
        LinkedList <T> new_list;
        Node * curr = list.head;
        while (curr) {
            new_list.insert(func(curr -> data));
            std::cout << "Putting into new list: " << func(curr -> data) << std::endl;
            curr = curr -> next;
        }
        std::cout << "Getting out of apply" << std::endl;
        return new_list;
    }

    int length() {
//        std::cout << "DEBUG length 1" << std::endl;
        int counter = 0;
        Node * tmp = head;
//        std::cout << "DEBUG length 2" << std::endl;
        while( tmp != nullptr ) {
//            std::cout << "DEBUG length 3" << std::endl;
            counter++;
            tmp = tmp -> next;
        }
        return counter;
    }

    void insert(T value) {
        // Add first node
        if (head == nullptr) {
            std::cout << "Add first node" << std::endl;
            head = new Node(value);
            head->next = nullptr;
            return;
        }

        Node *curr = head;
        // check if should be new head (when new value smaller than current head) -> add new head
        if (value <= head->data) {
            // add new head
            std::cout << "add new head" << std::endl;
            Node * new_head = new Node(value);
            new_head -> next = head;
            head = new_head;
            return;
        }

        while (curr != nullptr) {
            if (curr->next == nullptr && value >= curr->data) {
                // add new tail
                std::cout << "add new tail" << std::endl;
                Node * new_node = new Node(value);
                curr -> next = new_node;
                new_node -> next = nullptr;
                return;
            } else if (value >= curr->data && value <= curr->next->data) {
                // add new node between those two
                std::cout << "add new node between those two" << std::endl;
                Node * new_node = new Node(value);
                Node * temp_ptr = curr -> next;
                curr -> next = new_node;
                new_node -> next = temp_ptr;
                return;
            } else {
                curr = curr->next;
            }
        }
    }

    void remove(T value) {
        // TODO: Check if delete all accurancies
        if (!is_in_list(value)){
            return;
        }

        // handle the head
        if (head->data == value) {
            if (head->next != nullptr) {
                // head is not single node
                Node * temp_ptr = head->next;
                delete head;
                head = temp_ptr;
                return;
            } else {
                // head is single node
                delete head;
                head = nullptr;
                return;
            }
        }

        Node * curr = head;
        Node * prev = head;
        while (curr != nullptr){
            if (curr -> data == value){
                // as we are already handled the head case,
                // at this point we know that curr != head.
                prev->next = curr->next;
                delete curr;
                return;
            } else {
                prev=curr;
                curr=curr->next;
            }
        }

    }

    void print() {
        Node * curr = head;
        while (curr != nullptr) {
            cout << curr -> data << endl;
            curr = curr -> next;
        }
    }

    Iterator begin() {
        return head;
    }
    Iterator end() {
        return Iterator(nullptr);
    }
};


#endif

这是运行后的日志:

C:\Users\User\CLionProjects\ex2.2\cmake-build-debug\exe_name.exe
Hello, World!
Add first node
add new head
add new head
Now printing myList
Pavel <3
Rikki
yosi
Add first node
Putting into new list: 8
add new head
Putting into new list: 5
add new head
Putting into new list: 4
Getting out of apply
Now printing new_list
@sk @sk X☻k B jw                            ░♦k א

                                                                     ≡   א          ☺   ☺   ♥       ?       ♥
    ☺       ☺   ?               ╨s  אs  ♦    α☼  Jαw                ╨ ☻    א       ☺   ☺       └ k פ☻k ñ☻k
  א



                               @sk     _«‼ó┼0 ☺    ה Γ π ♣☺!     B ! ! !         )☺            !
                                                               ! !
                                                               :«←╧q0 ♀                    ☺
                                           ≡Oúv        ≡§k x@«v☺
                               C
                                          C
                                                                                               PW╘wנM╘w
       o«←ת¶0    └ k
                     ∩«←→A0T   ┴


♦                       á☼  X   ┴


♦       ■   ☺   £)      á☼  \☺  ┴


♦                       á☼      


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                                


                            o«←ת┴0pNז█▲I╓☻▲╔ ☻▲Θ♠☻▲I*☻
                                          ⌂»←כA F«v F«v@F«v`F«vאF«váF«v└F«vαF«v G«v G«v@G«v`G«vאG«váG«v└G«vαG«v H«v H«v@
H«v`H«v















                                                       r«←חQ1 ♀csmα☺           ♥    ♣ף↓╪§k pמ⌠█
                        ers\Use}«←ט\0 ♀╝↕úGúv    2   ;«←╬S0☻   τ♦
                                 ►►►►►►►►►►►►►►►►►►►►►►►►►►

                                                 abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ        F
                                             ╡
   H»←╝§0
╚↑k σ↑k ♀↓k 5↓k G↓k _↓k z↓k ½↓k ┐↓k ▐↓k ∙↓k d→k s→k ף→k ╝→k Γ→k ≡→k ↓←k P←k q▲k ש▲k ╫▲k         ▼k ↨▼k ?▼k Y▼k q▼k ó▼k ╞
▼k ß▼k  ▼k ¶ k * k P k ש k ª k └ k σ k !!k E!k \!k n!k ו!k     PROCESSOR_ARCHITEW6432=AMD64 USERDOMAIN_ROAMINGPROFILE=TH
EAMAZINGME LOCALAPPDATA=C:\Users\User\AppData\Local PROCESSOR_LEVEL=6 USERDOMAIN=THEAMAZINGME LOGONSERVER=\\THEAMAZINGME
 FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer SESSIONNAME=Console ALLUSERSPROFILE=C:\ProgramData PROCESSOR_ARCHITECT
URE=x86 PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules Syste
mDrive=C: OneDrive=C:\Users\User\OneDrive AV_APPDATA=C:\Users\User\AppData\Roaming APPDATA=C:\Users\User\AppData\Roaming
 USERNAME=User ProgramFiles(x86)=C:\Program Files (x86) CommonProgramFiles=C:\Program Files (x86)\Common Files Path=C:\P
rogram Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;C:\Program Files (x86)\Common Files\Oracle\Ja
va\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDO
WS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA N
vDLISR;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\Sy
stem32\OpenSSH\;C:\TDM-GCC-64\bin;C:\Program Files (x86)\Bitvise SSH Client;C:\Program Files\CMake\bin;C:\Program Files\
Git\cmd;C:\Users\User\AppData\Local\Microsoft\WindowsApps;C:\Modeltech_pe_edu_10.4a\win32pe_edu;C:\Users\User\AppData\Lo
cal\Microsoft\WindowsApps;C:\Users\User\AppData\Local\GitHubDesktop\bin FPS_BROWSER_USER_PROFILE_STRING=Default PATHEXT=
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC DriverData=C:\Windows\System32\Drivers\DriverData OS=Windows_NT On
eDriveConsumer=C:\Users\User\OneDrive COMPUTERNAME=THEAMAZINGME PROCESSOR_REVISION=8e09 CommonProgramW6432=C:\Program Fi
les\Common Files ComSpec=C:\WINDOWS\system32\cmd.exe ProgramData=C:\ProgramData ProgramW6432=C:\Program Files HOMEPATH=\
Users\User SystemRoot=C:\WINDOWS TEMP=C:\Users\User\AppData\Local\Temp PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 S
tepping 9, GenuineIntel HOMEDRIVE=C: USERPROFILE=C:\Users\User TMP=C:\Users\User\AppData\Local\Temp CommonProgramFiles(x
86)=C:\Program Files (x86)\Common Files ProgramFiles=C:\Program Files (x86) PUBLIC=C:\Users\Public windir=C:\WINDOWS NUM
BER_OF_PROCESSORS=4 IDEA_INITIAL_DIRECTORY=C:\Users\User\CLionProjects\ex2.2   z«←ןf1∞↕úv☺   ☺   x§k 0→ºv    o«←תT0נן╚uá
ן╚u░ן╚u
   o«←תA≡]zw ^zw►^zw0^zw ^zwP^zw@^zwp^zw`^zwא^zwנ^zw
                w«←גA0°"k °"k °"k ☺☺                                                  w«←גY0@#k @#k @#k ☺☺
                                    x«←םYט#k ט#k ט#k ☺☺                          o«←תV░ךלt└ךלt╨ךלt כלt כלt@כלt0כלtpכלt`כ
לtPכלt                                                                                        {«←מA♥       ♦   ♥   ♣   ♣
   ♠       |«←יU0 ♀    └ k }«←טR0n c a l r p c   }«←טSn c a l r p c   {«←מS0 ♫n c a c n _ i p _ t c p         o«←תU ¶┤d
y┤d
   z«←ןA0 ♀                    S0  }«←טT0 ►xrk             z«←ןS0 ♀    ☻               S0  f«←ףT0                    D☻
 <☻      ►   ☺                       £)
                                     ☺   o«←תH░%k ☺
                                                      o«←תAנ¶┤nP↨┤n
                                                                   o«←תAנ¶Σo ¡∩oá¡∩o`¡∩o░¡∩o╨½∩oא½∩oP¡∩o░»Σo
                                                                                ?º←├A J
















                                                     ♦   ¼0  ל k ל k 8 k 8 k  0k  └












































































































































                                                                     u«←א◄9 ♫↓rk     CC:\Users\User\CLionProjects\ex2.2\
cmake-build-debug\exe_name.exe       |«←י[↓rk     t«←בR0 ☼C:\Users\User\CLionProjects\ex2.2\cmake-build-debug\exe_name.e
xe        {«←מZ0 ♀╨rk ♦   yosi    í☺ áS0      └ k {«←מU0 ♀°rk ♣   Rikki   └ k └ k ╚rk     {«←מU0 ♀ sk   Pavel <3    
≡rk T0  δ»→▲U0  └ k └ k 8                       נ☺ סU0  └ k └ k 5               @sk     כ☺ ךU0  └ k └ k 4
hsk     ז☺ חU0  └ k └ k










Process finished with exit code -1073741819 (0xC0000005)

标签: c++sortingtemplatesmethods

解决方案


这一行:

new_list = myList.apply(myList, getLen);

创建一个新的临时链表,然后将其复制分配给new_list.

您对复制赋值运算符的实现:

void operator = (T &t) {
    head = t.head;
}

没有制作正确的副本。它只是head指出您临时文件中的数据。

然后删除临时对象,而您new_list的只是一个悬空指针。


推荐阅读