; Показывает время выполнения, когда я использую массив указателей на строки, или это потому, что я не могу передать данные в функцию из массива указателей - PullRequest
0 голосов
/ 15 апреля 2020
    #include <stdio.h>
    #include <string.h>
    //reversal function

    void reverseString(char* str)
    {
        int l, i;
        char *begin_ptr, *end_ptr, ch;
        l = strlen(str);
        begin_ptr = str;
        end_ptr = str;

        //move  the ptr  to the final pos
        for (i = 0; i < l - 1; i++)
            end_ptr++;
        //pointer swaping
        for (i = 0; i < l / 2; i++)
        {
            ch = *end_ptr;
            *end_ptr = *begin_ptr;
            *begin_ptr = ch;
            begin_ptr++;
            end_ptr--;
        }
    }

    // Driver code

--------------------------------- главная ---------- -------------------------------------------------- --------------------------------------- вызов функции отправляет адрес первой строки в массив

int main()
{
    char *str[ ] = {"To err is human...","But to really mess things up...","One needs to know C!!"};
    for(int i=0;i<3;i++)
    {
    reverseString(str[i]);  //funtion call
    printf("Reverse of the string: %s\n", str[i]);
    }

    return 0;
}

1 Ответ

2 голосов
/ 15 апреля 2020

Вы не можете изменять строковый литерал. Любая попытка изменить строковый литерал приводит к неопределенному поведению.

Из C стандарта (6.4.5 строковых литералов)

7 Не определено, различаются ли эти массивы при условии их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.

Вы должны объявить размерный массив как

enum { N = 32 };
char str[][N] = 
{
    "To err is human...",
    "But to really mess things up...",
    "One needs to know C!!"
};

Обратите внимание к этому функция revreseString слишком сложна. Также лучше, когда функция возвращает указатель на обратную строку. Функция может быть определена следующим образом с помощью указателей

char * reverseString( char *s )
{
    if ( *s )
    {
        for ( char *p = s, *q = s + strlen( s ); p < --q; ++p )
        {
            char c = *p;
            *p = *q;
            *q = c;
        }
    }

    return s;
}

Вот демонстрационная программа

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

char * reverseString( char *s )
{
    if ( *s )
    {
        for ( char *p = s, *q = s + strlen( s ); p < --q; ++p )
        {
            char c = *p;
            *p = *q;
            *q = c;
        }
    }

    return s;
}

int main(void) 
{
    enum { N = 32 };
    char s[][N] = 
    {
        "To err is human...",
        "But to really mess things up...",
        "One needs to know C!!"
    };

    for ( size_t i = 0; i < sizeof( s ) / sizeof( *s ); i++ )
    {
        puts( reverseString( s[i] ) );
    }

    return 0;
}

Вывод программы:

...namuh si rre oT
...pu sgniht ssem yllaer ot tuB
!!C wonk ot sdeen enO
...