C: действительность указателей - PullRequest
0 голосов
/ 19 января 2019

Я написал этот код для чтения значений из файла, и если значением чтения является ";"есть, все значения, которые встречались до сих пор и были записаны в строку, должны быть записаны в поле массива указателей

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <windows.h>
    #define SIZE_STRINGS 100
    #define SIZE_ZS 15

    int index_drei;
    char *laenge_drei[SIZE_STRINGS];

    char* string_to_pointer(char []);
    void laengen_block_nach_siegen_ordnen();

    void spielweg_nach_laenge_des_spieweges_ordnen(bool spieler)
    {
        int i,
            laenge,
            index_zs;
        char buchstabe,
             zs[SIZE_ZS],
             zs2[SIZE_ZS],
             *zs_p;
        bool akt_laenge_auslesen;
        FILE * fp;

        if(spieler)
            fp = fopen("Anlagen\\spielweg_spieler.txt", "r"); //Datei öffnen
        else
            fp = fopen("Anlagen\\spielweg_ai.txt", "r"); //Datei öffnen

        akt_laenge_auslesen = true;
        index_drei = 0;

        laenge = 0;
        index_zs = 0;
        for(i = 0; i < SIZE_ZS; i++)
        {
            zs[i] = 0;
        }

        if(fp == NULL)
        {
        }else
        {
            while((buchstabe = fgetc(fp))!=EOF)
            {
                zs[index_zs] = buchstabe;
                index_zs++;
                if(akt_laenge_auslesen == true && buchstabe == '-')
                    akt_laenge_auslesen = false;
                else if(akt_laenge_auslesen)
                    laenge = buchstabe - '0';
                else if(buchstabe == ';')
                {
                    if(laenge == 3)
                    {
                        laenge_drei[index_drei] = string_to_pointer(zs);
                        /*Firts value*/
                        strcpy(zs2, laenge_drei[0]);
                        printf("%s", zs2);Sleep(1000);
                        index_drei++;
                    }
                    akt_laenge_auslesen = true;
                    laenge = 0;
                    index_zs = 0;
                    for(i = 0; i < SIZE_ZS; i++)
                    {
                        zs[i] = 0;
                    }
                }
            }
            /*Second value*/
            strcpy(zs2, laenge_drei[0]);
            printf("%s", zs2);Sleep(1000);
            fclose(fp);
        }
    }

    char* string_to_pointer(char string[])
    {
        return string;
    }

Если я запишу значение из "length_drei [0]" с помощью strcpy в строке"zs2", я получаю:

  • / * первое значение * / правильное значение
  • / * второе значение * / неправильное значение (один пробел)

1 Ответ

0 голосов
/ 19 января 2019

Вы не выделяете память для сегментов строки, которые пытаетесь сохранить в laenge_drei.В конце цикла каждый индекс laenge_drei содержит ссылку на zs и, следовательно, последнюю обработанную строку.

if(laenge == 3)
{
    laenge_drei[index_drei] = strdup(zs);
    printf("%s", laenge_drei[index_drei]);
    sleep(1000);
    index_drei++;
}

Измените strcpy(zs2, laenge_drei[0]) на strcpy(zs2, laenge_drei[index_drei]), если вы пытаетесьраспечатайте каждый сегмент, или вы будете продолжать печатать первый снова и снова.

Когда вы выйдете из цикла и попытаетесь снова напечатать laenge_drei[0], он все равно будет иметь первое значение.Не забудьте освободить память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...