После изменения строки (char *) в функции значение не будет отображаться, пока не будет напечатано внутри функции - PullRequest
0 голосов
/ 12 ноября 2018
#include <stdio.h>
#include <string.h>
void increase(char **tab)
{
    int i=strlen(*tab);
    int o=i;
    while((*tab)[i]!='5' && i>=0)
    {
        i--;
    }
    if(i>=0)
    {
        int tt;
        char array[o+1];
        for(tt=0;tt<o;tt++)
        {
            if(tt!=i)
            array[tt]=(*tab)[tt];
            else
            array[tt]='6';
        }
        array[o]='\0';
        *tab=array;
    //  printf("\n%s",*tab);
    }
    else
    {
        char array[o+2];
        int tt;
        for(tt=0;tt<=o;tt++)
        {
            array[tt]='5';
        }
        array[o+1]='\0';
        *tab=array;
    //  printf("\n%s",*tab);
    }
}
int main()
{
    int n;
    char *test;
    test="555"; 
    increase(&test);
    printf("\n%s",test);

    return 0;
}

Хорошо, так что increment () предназначен для замены числа в тесте следующим числом, содержащим только 5 и 6. То, что я хотел сделать, это изменить значение теста напрямую, используя указатель на символ *. Кажется, все работает нормально, пока не появится отображение измененного значения - оно просто не будет отображаться, если не будет предложено сделать это внутри функция увеличения (). Как только я добавлю

printf("\n%s",*tab);

внутри любого из условий (с комментариями) все работает просто отлично (исключая показ двойного результата). В чем здесь проблема?

555 - это просто тестовое значение, фактически любое число из 5 или 6 будет работать.

1 Ответ

0 голосов
/ 12 ноября 2018

Строки, подобные *tab=array;, вызывают проблему, учитывая, что array - это локальная переменная, которая выходит из области видимости, когда заканчивается ее закрывающий блок. В main() test теперь указывает на недопустимую память, а попытка использовать ее - неопределенное поведение.

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