Инициализация указателя на строку: искаженный текст? - PullRequest
0 голосов
/ 06 июля 2019

Я получаю искаженный текст и неверное возвращаемое значение после инициализации указателя на массив символов. Я совсем не понимаю. Я использую Linux GCC в качестве компилятора.

Пробовал также с этим онлайн-компилятором, те же результаты: https://www.onlinegdb.com/online_c_compiler

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

// Prototypes -------------------------------------------------------------{{{1

void get_extension(const char *file_name, char *extension);
bool test_extension(const char *file_name, const char *extension);

// Main function ----------------------------------------------------------{{{1

int main()
{
    printf("%d\n", test_extension("name.txt", "txt"));
    return 0;
}

// Functions definitions --------------------------------------------------{{{1


void get_extension(const char *file_name, char *extension)
{
    int i;
    strcpy(extension, "");
    for (i=0; i < strlen(file_name) - 1; ++i)
        if ( file_name[i] == '.' ) break;
    if ( i == strlen(file_name) - 1 ) return;
    strcpy(extension, &file_name[i+1]);
}

bool test_extension(const char *file_name, const char *extension)
{
    char ext[] = "";
    get_extension(file_name, ext);

    printf("%s %s\n", ext, extension); // values before pointer init
    char *p = ext;
    printf("%s %s\n", ext, extension); // why did the string change??

    while ( *extension )
        if ( toupper(*p++) != toupper(*extension++) ) return 0;
    return 1;
}

Я ожидаю, что возвращаемое значение будет равно 1, а не получит искаженный текст во втором вызове printf ().

1 Ответ

1 голос
/ 06 июля 2019

После char ext[] = "";, ext - это char[1]get_extension вы пытаетесь записать в него все расширение, которое явно не подходит.Запись за пределы массива является неопределенным поведением, что означает, что все может произойти.

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