изменение значения символа в расположении строки с параллельной стороной, например, yuv = vuy

Я пытаюсь понять, почему значение каждого местоположения массива строки не может быть изменено при вводе указателя строки в функцию

я пытался использовать вместо [], чтобы *

#include <stdio.h>
#include <string.h>
void func(char * p)
{
int i;
char letter;
for(i = 0 ; i < strlen(p) / 2; i++)
{
    letter = p[strlen(p)-i-1];
    p[strlen(p)-1-i] = p[i];
    p[i] = letter;
}
puts(p);

int main()
{
char * p = "dudu";
func(p);
return 0;
}

Примером того, что я должен сделать, может быть Джон, а затем вывод функции nhoj, например, изменение сторон символов строки.

изменение значений начала с конца строки

Всего 2 ответа



В этой декларации

char * p = "dudu";

указатель p инициализируется адресом первого символа строкового литерала "dudu" .

Внутри функции func вы пытаетесь изменить строковый литерал, используя указатель.

Строковые литералы неизменны в C (и C ++). Любая попытка изменить строковый литерал приводит к неопределенному поведению.

Чтобы сделать код действительным, вы должны использовать массив символов, как, например,

char s[] = "dudu";

Другой способ - динамически выделить массив и сохранить в нем строку, как, например,

const char *p = "dudu";
char *s = malloc( strlen( p ) + 1 );
strcpy( s, p ); 

Учтите, что гораздо лучше переписать функцию func следующим образом

char * func( char *s )
{
    for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
    {
        char c = s[n - i - 1];
        s[n - i - 1] = s[i];
        s[i] = c;
    }

    return s; 
}

и называть это как

puts( func( s ) );

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

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

char * func( char *s )
{
    for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
    {
        char c = s[n - i - 1];
        s[n - i - 1] = s[i];
        s[i] = c;
    }

    return s; 
}

int main( void )
{
    char s[] = "Hello JustAskingSmartPeople";

    puts( s );
    puts( func( s ) );
}

Выход программы

Hello JustAskingSmartPeople
elpoePtramSgniksAtsuJ olleH

Есть идеи?

10000