strcpy

时间:2016-06-15 07:27:01

标签: c

我正在用C写一篇semestral作品,但我无法在这里认识到这个问题。当我在调试中运行代码时,它会让我遇到分段错误。我不确定是什么问题。以前我将内存分配给poleNazvu,但不是分段错误,而是让我“尝试释放非堆对象”,所以这不是一种方法。请告诉我如何处理分段错误。它发生在我strcpy(poleNazvu ......)的行上,我在代码中标记了它。 ALOKACE_POLI = 200; ALOKACE_MALA = 20;它的作用是需要一个“约翰500”和levaStrana得到“约翰”而pravaStrana得到“500”所以我试图将levaStrana复制到poleNazvu和pravaStrana到poleKreditu。在此代码片段结束时,剪辑是分段错误。

void menuHighlights(void)                                               //menu se zebricky uzivatelu
{
    char vyber3, * poleNazvu[ALOKACE_POLI][ALOKACE_MALA],line[ALOKACE_LINE];
    char * prohodJmeno, * menic, * separator, * levaStrana, * pravaStrana;
    int poleKreditu[ALOKACE_POLI], count=0, countMax=0, prohodCislo, d;
    FILE *NACTENI;
    //int alokace1=0, alokace2=0;                                                       //vytvoreni promenne pro soubor


    fflush(stdin);                                                      //vyprazdneni bufferu
    system("cls");                                                      // vycisteni obrazovky
    printf("\nZebricek nejlepsich hracu:\n");                                               //tisk hlavicky
    fflush(stdin);                                                      //buffer
    NACTENI = fopen(SOUBOR_HRACU , "r");                                    //ulozeni otevreneho souboru do promenne
    if(NACTENI == NULL) {                                            //jestlize v promenne nic neni
        perror("Soubor nenalezen.");                                    //vypis error
        Sleep(HODNOTA_BIG_SLEEP);                                                   //nech uzivatel aby si to precetl
        exit(1);    //a pak ukonci seanci
    }

    while (fgets(line, sizeof line, NACTENI) != NULL) {                 //pokud radek nacteny ze souboru nebude prazdny
        fflush(stdin);                                                  //buffer
        menic=line;                                                     //anti-decay opatreni promenne line
        separator = " ";
        levaStrana = strtok(menic, separator);
        pravaStrana = strtok(NULL, "");
        //if ((poleNazvu[count][ALOKACE_MALA-1]=(char *)malloc(ALOKACE_PROHAZOVANI*sizeof(char)))==NULL) {
        //    printf("Nedostatek pameti. Ukoncuji.");
        //    exit(1);
        //}
        //alokace1=1;
        strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE
        poleKreditu[count]=atoi(pravaStrana);
        if (countMax<count) {
            countMax=count;
        }
        count++;
    }

1 个答案:

答案 0 :(得分:1)

在通话中

strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE

目标poleNazvu[count][ALOKACE_MALA-1] 未初始化的 指针。它的值是不确定导致未定义的行为

在复制之前为指针分配内存,或者使用strdup代替(在单个调用中进行分配和复制),或使poleNazvu不是指向{{的指针数组的数组1}}。

还有一些事情没有任何意义,例如为什么你使用char作为目的地?它总是将字符串复制到数组数组中的相同条目。

也许你应该让poleNazvu[count][ALOKACE_MALA-1]成为poleNazvu数组的数组,而不是指向char的数组数组?像

char

然后你会做

char poleNazvu[ALOKACE_POLI][ALOKACE_MALA];

当然,这要求strcpy(poleNazvu[count], levaStrana); 中字符串的长度小于levaStrana个字符。所以也许使用ALOKACE_MALA和显式终止,比如

strncpy