这个循环怎么会崩溃我的程序?

时间:2017-09-27 02:48:24

标签: c++ gcc

我似乎无法弄清楚我的程序崩溃的原因。当我在" //显示名称选项"下删除while循环时程序运行正常。代码在GCC上编译,没有任何警告。它可能是我的编译器吗?它与fstream有关吗?帮助将不胜感激。

噢,是的。如果您想知道这个程序将读取data.txt并将适当的数据加载到播放器功能的实例。目前处于不完整状态。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
#define cls system("cls");

bool Pload = false;

void menu();

struct player {
    int Px, Py, life = 20;
    string name = "";
};

main() {
    menu();
}

void menu() {
    string cLine,names,input;

    int x,i,lineNum = 0;
    fstream data;

    menu:

    data.open("data.txt");
    //Gets list of all names in data.txt, Adds them to string names
    while(data.good()) {
        getline(data,cLine);
    if(cLine[0] == '/') {
        names += cLine;
    }
}           
names += '\n';

//Displays name options
cls
cout << "Welcome to  W A L K.\n\nWhat is your name?\n";
while(names[i] != '\n') 
{
    cout << i; 
    if(names[i] == '/') {cout << endl;i++;} else {cout << names[i];i++;}
}
cout << endl;
getline(cin,input);

//checks if name exits and loads file data into player/world objects 
data.close();
data.open("data.txt");
while(data.good()) {
    lineNum++;
    getline(data,cLine);
    if(cLine.erase(0,1) == input) {
        cls cout << "Found Name" << endl;
        getline(cin, input);

        }

    }
//Restarts menu
data.close();
goto menu;
}

data.txt中

/Sammy
x:0
y:0
l:20
\

/Mary
x:7
y:9
l:20
\


/Dill
x:7
y:9
l:20
\

/Jack
x:7
y:9
l:20
\

1 个答案:

答案 0 :(得分:3)

使用您的调试器会发现这一点,或只是使用一些cout语句。

以下列方式声明i时:

int x,i,lineNum = 0;

您声明3 int并将lineNum初始化为0;但是其他两个仍然是单元化的,因此使用它们是不明确的行为。

while(names[i] != '\n') // UB, i is unitialised

首选每行声明并初始化一个变量,如下所示:

auto x = 0;
auto i = 0;
auto lineNum = 0;

使用auto也会强制您将它们初始化为值。

如果你想在一行上写下所有内容,你必须写

auto x = 0, i = 0, lineNum = 0;

但它只是没有可读性,没有人会感谢你。