Указатели и строки в C - PullRequest
       1

Указатели и строки в C

1 голос
/ 27 марта 2012

Я пытаюсь написать функцию для модификации строк в C. Если у меня есть функция, как

char *func(char *s){
    char *t=s;
    s++;     //option 1
    t++;     //option 2
    *t='a';  //option 2
    return s;
}

Если я сделаю что-то вроде [вариант 1]: s++; Я верю, что он вернет указатель туда, куда сейчас указывает s. Если я сделаю [вариант 2]: t++; и *t='a';, то return s, будет ли он возвращать адрес для первой позиции s, но с измененным содержимым, или он вернет адрес с исходным содержимым?

Ответы [ 4 ]

4 голосов
/ 27 марта 2012
char *func(char *s)

В этом коде s - это указатель на область памяти, которая (я предполагаю) представляет строку.

s++;

теперь s указывает на следующий символ в той же области памяти, который (я предполагаю) представляет строку.

char *t=s;

Теперь у вас есть два указателя на эту область памяти.

t++;
*t='a';

Теперь вы изменили эту область памяти, заменив второй символ на 'a'.

Поэтому: если вы затем вернете s, вы вернете указатель на ту же область памяти, которая была изменена. Если вы хотите вернуть измененную копию строки, вы должны сначала сделать копию памяти.

char *func(char *s){
    char *t=strdup(s); //duplicates a string
    s++;
    *t='a';
    free(t); //you have to free the memory from strdup at some point
    return s; //returns pointer to second character of unchanged string
 }
2 голосов
/ 27 марта 2012

Если я делаю т ++; и * t = 'a'; затем вернуть s, он вернет адрес для первое место s, но с измененным содержимым, или оно вернет адрес с оригинальным контентом?

Я полагаю, что ваш вопрос предполагает что-то вроде этого:

char s[] = "abcde";
char *t = s;
t++;
*t = 'a';

Здесь у вас есть одна строка и два указателя, которые изначально оба указывают на начало строки. В третьей строке вы изменяете один из указателей, чтобы он указывал на следующий символ. В четвертой строке вы изменяете данные в этом месте. Поскольку s указывает на те же данные, а данные модифицируются, строка, на которую указывает s, изменится.

printf("s is: %s\n", s");   // s is: aacde
printf("t is: %s\n", t");   // t is: acde

Кстати, нет лучшего способа научиться этому, чем писать небольшие тестовые программы и играть с ними. Хорошая книга объяснит, как все должно работать, но игра с кодом - это то, как вы начинаете понимать код и верить тому, что говорят вам книги.

0 голосов
/ 27 марта 2012

Какое поведение вам нужно?

Имеет смысл как возвращать начальное значение s, так и возвращать конечное значение s.

Единственная опция, которую у вас нет, - это *t='a', но возврат с исходной памятью без изменений.Память изменена

Возвращение оригинальных s довольно распространено, например, strcpy.

Также обычно возвращают указатель на «следующий символ после того, который я только что изменил» (это вариант, который вы не предлагали).

Вам нужно продумать и решить, что полезная функция для этой функции?

0 голосов
/ 27 марта 2012

В коде:

char *func(char *s)
{
    char *t=s;
}

отсутствует оператор возврата, поэтому возвращается мусор.

Переменная s является локальной копией всего, что вы передали в функцию,Если вы пишете s++ внутри функции, вы изменяете то, на что указывает локальный указатель, но не меняете аргумент.

Когда вы делаете t++; и *t = 'a';, вы делаете tукажите на второй символ строки, переданный как s, а затем присвойте ему символ 'a'.

Итак, если у вас есть:

char *func(char *s)
{
    char *t = s;
    s++;
    t++;
    *t = 'a';
    return s;
}

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

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