Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 此函数使.exe崩溃,我做错了什么?_C++_C_Crash_Codeblocks - Fatal编程技术网

C++ 此函数使.exe崩溃,我做错了什么?

C++ 此函数使.exe崩溃,我做错了什么?,c++,c,crash,codeblocks,C++,C,Crash,Codeblocks,我有两种结构:medic和patient。我必须从2个不同的.txt文档中读取数据,然后在控制台中显示。 我用的是代码块。当我试着调试它时,我发现就在执行citireM之后发生了这种情况。我向老师询问了这件事,并在谷歌上搜索了一下,但没有结果 #include <iostream> #include <fstream> #include <string.h> using namespace std; struct date { int d,m,y; }

我有两种结构:medicpatient。我必须从2个不同的.txt文档中读取数据,然后在控制台中显示。
我用的是代码块。当我试着调试它时,我发现就在执行citireM之后发生了这种情况。我向老师询问了这件事,并在谷歌上搜索了一下,但没有结果

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
struct date
{
    int d,m,y;
};
struct medic
{
    int cod;
    char name[50],specs[50];
};
struct patient
{
    int cod;
    date bd;
    char name[50],adress[50];
};
struct consultatie
{
    int codp,codm;
    date dc;
    char diag[100];
};
void citireM(medic M[], int &n)
{
    int i; char * p; char l[50];
    ifstream f("medics.txt");
    f>>n;
    for(i=0;i<n;i++)
    {
        strcpy(l,"");
        f>>M[i].cod;
        f.getline(l,50);
        p=strtok(l,";");
        strcpy(M[i].name,p);
        p=strtok(NULL,";");
        strcpy(M[i].specs,p);
    }
}
void citireP(patient P[], int &n)
{
    char * p; char l[50];
    ifstream ff("patients.txt");
    ff>>n;
    for(int i=0;i<n;i++)
    {
        ff>>P[i].cod;
        strcpy(l,"");
        ff.getline(l,50);
        p=strtok(l,";");
        strcpy(P[i].name,p);
        p=strtok(NULL,";");
        strcpy(P[i].adress,p);
        ff>>P[i].bd.d>>P[i].bd.m>>P[i].bd.y;
    }
}
void printM(medic M[], int n)
{
    for (int i=0;i<n;i++)
        cout<<M[i].cod<<" "<<M[i].name<<" "<<M[i].specs;
}
void printP(patient P[], int n)
{
    int i;
    for (i=0;i<n;i++)
        cout<<P[i].cod<<" "<<P[i].name<<" "<<P[i].adress<<" "<<P[i].bd.d<<"/"<<P[i].bd.m<<"/"<<P[i].bd.y;
}
int main()
{
    medic m[30];
    patient p[300];
    int nm,np;
    citireM(m,nm);
    citireP(p,np);
    printM(m,nm);
    printP(p,np);
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构日期
{
int d,m,y;
};
结构医生
{
国际化学需氧量;
字符名称[50],规格[50];
};
结构病人
{
国际化学需氧量;
日期bd;
字符名[50],地址[50];
};
结构咨询
{
int-codp,codm;
日期dc;
char-diag[100];
};
无效citireM(medic M[],国际和北美)
{
int i;char*p;char l[50];
IFF流(“medics.txt”);
f> >n;
对于(i=0;i>M[i].cod;
f、 getline(l,50);
p=strtok(l,“;”);
strcpy(M[i].名称,p);
p=strtok(空,“;”);
strcpy(M[i].规范,p);
}
}
无效花旗代表(患者P[],内部和非)
{
字符*p;字符l[50];
ifstream ff(“patients.txt”);
ff>>n;
对于(int i=0;i>P[i].cod;
strcpy(l,“”);
ff.getline(l,50);
p=strtok(l,“;”);
strcpy(P[i].名称,P);
p=strtok(空,“;”);
strcpy(P[i].地址,P);
ff>>P[i].bd.d>>P[i].bd.m>>P[i].bd.y;
}
}
无效打印M(medic M[],内部n)
{

对于(int i=0;i我正试图使您的函数与您的函数保持尽可能接近。但是有更简洁的方法可以做到这一点。这也没有考虑输入文件的错误,但我只是想让您走上正确的轨道

int char_to_int(char* src)
{
    int res = 0;
    for(int i = 0; src[i] != '\0'; ++i) {
        res = res * 10 + src[i] - '0';
    }
    return res;
}

void citireP(patient P[], int &n)
{
    const int BUFFER_SIZE = 256;
    char* p; char l[BUFFER_SIZE];
    char* date;
    ifstream ff("patients.txt",ios_base::skipws);
    ff >> n;
    char input[3][BUFFER_SIZE];
    for(int i = 0; i<n; i++) {
        ff >> P[i].cod;
        strcpy(l, "");
        ff.getline(l,BUFFER_SIZE);
        p = strtok(l, ";");
        strcpy(P[i].name, p);
        p = strtok(NULL, ";");
        strcpy(P[i].adress, p);
        p = strtok(NULL, ";");
        date = strtok(p, " ");
        P[i].bd.d = char_to_int(date);
        date = strtok(NULL, " ");
        P[i].bd.m = char_to_int(date);
        date = strtok(NULL, " ");
        P[i].bd.y = char_to_int(date);
    }
}
int字符到int字符(字符*src)
{
int res=0;
对于(int i=0;src[i]!='\0';++i){
res=res*10+src[i]-'0';
}
返回res;
}
无效花旗代表(患者P[],内部和非)
{
const int BUFFER_SIZE=256;
char*p;char l[缓冲区大小];
字符*日期;
ifstream ff(“patients.txt”,ios_base::skipws);
ff>>n;
字符输入[3][BUFFER_SIZE];
对于(int i=0;i>P[i].cod;
strcpy(l,“”);
ff.getline(l,缓冲区大小);
p=strtok(l,“;”);
strcpy(P[i].名称,P);
p=strtok(空,“;”);
strcpy(P[i].地址,P);
p=strtok(空,“;”);
日期=strtok(p,“”);
P[i].bd.d=char_to_int(日期);
日期=strtok(空,“”);
P[i].bd.m=char_to_int(日期);
日期=strtok(空,“”);
P[i].bd.y=char\u to\u int(日期);
}
}
编辑


我刚刚为您编写了一个atoi类型函数,这样您就不必在项目中包含额外的内容。

检查
l
中的内容,并确保
p
在传递给
strcpy()之前不为
NULL
。这次崩溃应该意味着你写的内容超过了本地数组的结尾。唯一有意义的本地数组是
l
,我看不出你有任何方法可以写超过它的结尾。我看不到任何防止写超过
m
结尾的方法。这不应该完全符合症状,但你应该有一些防范措施无论如何,它可能是你正在追寻的bug。更基本的问题是C字符串是C中初学者错误的最大来源,并且是对真正字符串的一般腐烂近似。你把问题加在C++上,而不是C(使用C++流)。。那么,为什么你要使用C字符串和C数组,而std::string和std::vector更有意义呢?你也应该发布你的txt文件。而@JSF我使用这些,因为我的学校要求我使用它们。我个人更喜欢std::string,因为我发现它更容易使用。你已经读了这行了,现在你正在尝试阅读t的下一行内容日期变量。这基本上意味着我必须完全改变我的想法。是的,这是一个我已经挣扎了将近一周的家庭作业。我只是不知道如何输入整个医生/患者的姓名(或任何其他长度未知且用空格分隔的字符/字符串)从txt中。@David你需要使用getline吗?不,我只需要使用string.h。使用getline并通过strtok分隔数据是我的主意。你只是想要答案还是希望我帮你得到答案,因为这是家庭作业?两者都可以。以花费你时间较少的为准。 2 321 Insert Name Here; Timisoara, judetul Timis; 2 5 1991 123 Insert Some Other Name Here; Nu se stie unde traieste; 1 6 1654
int char_to_int(char* src)
{
    int res = 0;
    for(int i = 0; src[i] != '\0'; ++i) {
        res = res * 10 + src[i] - '0';
    }
    return res;
}

void citireP(patient P[], int &n)
{
    const int BUFFER_SIZE = 256;
    char* p; char l[BUFFER_SIZE];
    char* date;
    ifstream ff("patients.txt",ios_base::skipws);
    ff >> n;
    char input[3][BUFFER_SIZE];
    for(int i = 0; i<n; i++) {
        ff >> P[i].cod;
        strcpy(l, "");
        ff.getline(l,BUFFER_SIZE);
        p = strtok(l, ";");
        strcpy(P[i].name, p);
        p = strtok(NULL, ";");
        strcpy(P[i].adress, p);
        p = strtok(NULL, ";");
        date = strtok(p, " ");
        P[i].bd.d = char_to_int(date);
        date = strtok(NULL, " ");
        P[i].bd.m = char_to_int(date);
        date = strtok(NULL, " ");
        P[i].bd.y = char_to_int(date);
    }
}