изменение значения символа в расположении строки с параллельной стороной, например, yuv = vuy - PullRequest
0 голосов
/ 17 мая 2019

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

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

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

Примером того, что я собираюсь сделать, может быть Джон и чем вывод функции нхой как смена сторон символов строки

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

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Строковые литералы «запекаются» в вашем exe-файле, часто где-то только для чтения.(См. этот вопрос ).

Когда вы говорите

char * p = "dudu";

, вы указываете туда - поэтому не можете изменить это.(Или, по крайней мере, не стоит пытаться).

Если вы говорите

char p [] = "dudu";

, все меняется.Ваш массив символов теперь содержит строковый литерал в вашем стеке, так что вы можете изменять отдельные символы.

Вы также можете выделить char * с malloc и memcpy строковый литерал там иизмени это.

0 голосов
/ 17 мая 2019

В этом объявлении

char * p = "dudu";

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

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

Строковые литералы неизменны в 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
...