无法在cmd.exe上运行此程序

时间:2012-05-22 08:44:25

标签: c file fopen

我试图从文件中复制一些文本并将它们保存在struct成员中,我在cmd.exe上运行我的程序并且它崩溃了,但是当我在codeblocks或visual studio上运行它时,它可以工作,

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

struct AMIGOS 
{ 
    char nom[' '];
    char apellido[' '];
    char nompila[' '];
    char tel[' '];
    char correo[' '];
    char dir[' '];
    char fecha[' ']; 
};

int main()
{
    struct AMIGOS reg;
    char registro[128];

    char**datos;
    char*dato;
    datos = (char**)malloc(10*sizeof(char**));
    int tam;
    int i=0;

    FILE* pt = fopen("arch.txt","r");
    if(pt==NULL)
    {
        printf("filenotfound\n");
    }
    else
    {
        while(fgets(registro,128,pt))
        {
            dato = strtok(registro,"|");
            while(dato)
            {
                tam = strlen(dato);
                datos[i] = (char *)malloc(tam);
                memcpy(datos[i],dato,tam);
                datos[i][tam]=0;
                i++;
                datos[i]=0;
                dato = strtok(0,"|");
            }    
        }
        strcpy(reg.nom,datos[0]);
        strcpy(reg.apellido,datos[1]);
        strcpy(reg.nompila,datos[2]);
        strcpy(reg.fecha,datos[3]);
        strcpy(reg.tel,datos[4]);
        strcpy(reg.correo,datos[5]);
        strcpy(reg.dir,datos[6]);

        printf("%s\n",reg.nom);
        printf("%s\n",reg.apellido);
        printf("%s\n",reg.nompila);
        printf("%s\n",reg.fecha);
        printf("%s\n",reg.tel);
        printf("%s\n",reg.correo);
        printf("%s\n",reg.dir);
    }    
}

文件上的文字:

kevin | clark | ns | march 15 2001 | 5555555 | l@mail.com | 123 street

当我尝试在cmd.exe上运行它时,有人知道为什么会崩溃吗?

4 个答案:

答案 0 :(得分:2)

这是在数组末尾写的:

tam = strlen(dato);
datos[i] = (char *)malloc(tam);
memcpy(datos[i],dato,tam);
datos[i][tam]=0;                 <---- 'tam -1' is the last element

您需要添加一个额外的字符来存储空终止符,或者您可以使用strdup()

datos[i] = strdup(dato);

答案 1 :(得分:1)

我不知道为什么它在Visual Studio中有效但在Cmd Line中崩溃了。但是,您的代码中存在一些问题:

        tam = strlen(dato); 
        datos[i] = (char *)malloc(tam); //You are not allocating memory for '\0' character
        memcpy(datos[i],dato,tam);
        datos[i][tam]=0; //So this is effectively an array out of bound write

应该是

        tam = strlen(dato); 
        datos[i] = (char *)malloc(tam+1); 
        memcpy(datos[i],dato,tam);
        datos[i][tam]=0; 

答案 2 :(得分:1)

以下是一些问题:

datos = (char**)malloc(10*sizeof(char**));

你的意思是:

datos = (char**)malloc(10*sizeof(char*));

(遵循正常的C语言:

var = malloc(n * sizeof *var);

会避免这个错误。在实践中,尺寸可能相同,但原则上是错误的。另请注意,转换malloc的结果在C中也是不受欢迎的。)

tam = strlen(dato);
datos[i] = (char *)malloc(tam);
memcpy(datos[i],dato,tam);
datos[i][tam]=0;

你的缓冲区溢出来了。您分配了tam个字节的内存,然后将tam个字节复制到其中,但之后您尝试NUL终止它。您需要分配tam + 1个字节。

作为其他建议:

  • 您对strcpy的使用不安全;你无法保证标记化输入也不会导致你溢出这些缓冲区。
  • fgets(registro,128,pt)会更好fgets(registro, sizeof registro, pt)

答案 3 :(得分:0)

此:

char nom[' '];

是非常奇怪的代码,它几乎肯定没有按照你的期望去做。我很想听听这段代码的动机。

它基本上将nom声明为一个字符数组,其长度由字符 SPACE 的整数值给出。假设有一台ASCII机器,这相当于:

char nom[32];