Манипулирующие строки в C - PullRequest
       19

Манипулирующие строки в C

1 голос
/ 19 октября 2011

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

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

В python я просто сделал бы следующее

def foo(str):
  return str

Очевидно, что не все так просто, как в C.

Может кто-нибудь сказать мне, как лучше всего этого добиться.Должен ли я использовать указатели для имитации передачи по ссылке и просто манипулировать исходной строкой?Любая помощь / ресурсы будет принята с благодарностью.

Обновление : я хочу предварительно выполнить операцию над строкой и вернуть результат этой операции (также строку).Я счастлив манипулировать исходной строкой или вернуть ее.Что когда-либо считалось бы лучшей практикой.

Задача, которую я поставил, основана на том, как выполнить эту операцию, поэтому я не хотел делать это явным.

Таким образом, Python будет:

def foo(str):
  #do something to str (which doesn't change it's length)
  return str

Ответы [ 8 ]

5 голосов
/ 19 октября 2011

Есть два способа:

  1. Если вы манипулируете исходной строкой, вам не нужно ничего возвращать
  2. Если вы не хотите изменять исходную строку, скопируйте ее с помощью strdup или malloc + strcpy и верните на нее указатель (char *). Абонент, конечно, должен free сделать это.

Все это зависит от вопроса: понадобится ли вызывающей стороне исходная строка ?

1 голос
/ 19 октября 2011

Существует много соглашений, но наиболее распространенным является:

void foo(char *destination, const char *source);

или

void foo(char *destination, size_t dest_len, const char *source);

Итак, вы передаете исходную строку в source как const (она не будет изменяться функцией), а выходная строка записывается в destination.

Конечно, вызывающая сторона должна убедиться, что destination имеет достаточный размер,в противном случае вызов приводит к неопределенному поведению.

0 голосов
/ 19 октября 2011

Ну, трудно понять, что вы спрашиваете, так как «манипулирование» может много значить.
Если вы не хотите сохранять оригинал, вы можете определить функцию следующим образом:

void changeString(char* str);

если вам нужно сохранить оригинал, вы можете скопировать содержимое во временный буфер, изменить его и вернуть так:

char* returnModified(char* str )
{
      char* tmp = malloc(strlen(str));
      strcpy(tmp, str);
      // do watever
      return tmp;
}

Используя новейший подход, убедитесь, что вы правильно отслеживаете выделенную память

0 голосов
/ 19 октября 2011

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

char *fill_with_dots(char *data, size_t len) {
    char *dst = data;
    while (--len) *dst++ = '.';
    *dst = 0;
    return data;
}
0 голосов
/ 19 октября 2011

Я думаю, что ответ на ваш вопрос заключается в том, что вам нужно фундаментальное понимание того, как строки представлены в C. Как только вы это получили, обработка больше не должна быть такой сложной.

Я бы предложил прочитать

http://cplus.about.com/od/learningc/ss/strings.htm

(первый URL, который я смог придумать, выглядит мне разумным)

Удачи.

0 голосов
/ 19 октября 2011

Если я понимаю, что вы хотите, было бы что-то вроде этого:

void foo(char *str /* , int n */) {
    // do something
    // str[3] = 'c';
}

Помните, что вы не можете превысить выделенное пространство для этой строки. Следовательно, необязательный int для указания длины.

Это если вы хотите изменить строку, но при этом сохранить ее в исходном хранилище.

Если вы хотите новую строку на основе существующей, то:

char* foo(char *str /* , int n */) {
    char *ret = malloc(/* what you need */);
    // do something, probably copy str to ret
    return ret;
}
0 голосов
/ 19 октября 2011

Как правило, ваша функция должна выделять строку нужного размера с помощью malloc.Например, вот функция, которая повторяет каждый символ:

def repeat_each(char* s) {
  char* res = malloc(strlen(s) * 2 + 1);
  if (!res) return res;
  char* resp = res;
  while (*s) {
    *resp++ = *s;
    *resp++ = *s;
    s++;
  }
  return res;
}

Ответственность за free возвращаемой строки лежит на вызывающей стороне.Обратите внимание, чтобы не вызывать strlen в цикле.Если вам это нужно более одного раза, сохраните его во временной переменной типа size_t.

0 голосов
/ 19 октября 2011

Это должно работать в C:

char* foo(char *str)
{
  return str;
}

Или просто:

void foo(char *str)
{
}

Поскольку вы на самом деле не трогаете str.

Если вы хотите понятьC, и сделай свою домашнюю работу без посторонней помощи, иди себе копию K & R .Немедленно!

...