C:指针的有效性

标签 c

我编写这段代码是为了从文件中读取值,如果读取的值是“;”就是,到现在为止发生的所有写入字符串的值都应该写入指针数组的字段中

    #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;
    }

如果我在字符串“zs2”中使用 strcpy 写入“length_drei [0]”的值,我得到:

  • /* 第一个值 */正确的值
  • /* 第二个值 */错误值(一个空格)

最佳答案

您没有为要保存在 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] 时,它仍将具有第一个值。不要忘记释放您的内存。

关于C:指针的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269829/

相关文章:

c++ - 如何在 C 中将字符串常量转换为预处理标记

c - 有没有办法在 GCC 中使用 fopen_s() 或至少创建一个关于它的#define?

c - Win32 ListView常用控件重画问题

c - C 中的链表 : What happens when we assign the current node to a temporary node pointer?

c - c中的函数头

c++ - 如何在 Qt Creator 中配置 CDB?

c - ncurses LINES 和 COLS 为 0?

objective-c - 静态分析器错误地发现表达式为 "always 0"

c - pthreads - 加入一组线程,等待一个线程退出

c - 调试套接字程序