簡體   English   中英

無法在cmd.exe上運行此程序

[英]cannot run this program on cmd.exe

我試圖從文件中復制一些文本並將其保存在struct成員中,我在cmd.exe上運行我的程序,但它崩潰了,但是當我在代碼塊或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 | 2001年3月15日|5555555|l@mail.com|123街

有人知道我嘗試在cmd.exe上運行時為什么會崩潰嗎?

這是在數組末尾寫的:

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);

我不知道為什么它可以在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; 

這里有幾個問題:

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

您的意思是:

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

(遵循以下常規習語:

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)更好。

這個:

char nom[' '];

是非常奇怪的代碼,幾乎可以肯定它沒有達到您的期望。 我有興趣聽到此代碼的動機。

基本上,它將nom聲明為字符數組,其長度由字符SPACE的整數值給出。 假設使用ASCII機器,這將等效於:

char nom[32];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM