在C中操纵字符串

时间:2011-10-18 20:41:45

标签: c arrays string pointers

披露:这是大学工作。我不希望代码完成我的任务,而是想了解如何最好地操作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 个答案:

答案 0 :(得分:5)

有两种方法:

  1. 如果您操纵原始字符串,则无需返回任何内容
  2. 如果您不想更改原始字符串,则应使用strdupmalloc + strcpy复制该字符串,并向其返回指针(char *)。调用者当然必须free完成后。
  3. 这一切都取决于问题:调用者是否需要原始字符串

答案 1 :(得分:1)

有许多惯例,但最常见的似乎是:

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

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

所以你将source中的原始字符串作为const传递(它不会被函数修改),输出字符串写在destination中。

当然,调用者需要确保destination的大小足够大,否则调用会导致未定义的行为。

答案 2 :(得分:0)

这应该适用于C:

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

或者只是:

void foo(char *str)
{
}

因为你实际上并没有碰到str。

如果您想了解C,并在没有帮助的情况下完成作业,请自行获取K&R的副本。立即!

答案 3 :(得分:0)

通常,您的函数应使用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类型的临时变量中。

答案 4 :(得分:0)

如果我明白你想要什么,那就是这样的:

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

答案 5 :(得分:0)

我认为你的问题的答案是你需要一个基本的理解如何在C中表示字符串。一旦你得到它,处理应该不再那么困难。

我建议阅读

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

(我能提出的第一个对我来说合理的网址)

祝你好运。

答案 6 :(得分:0)

在C语言中,您可能还需要传递可在字符串中使用的最大大小。

char *fill_with_dots(char *data, size_t len) {
    char *dst = data;
    while (--len) *dst++ = '.';
    *dst = 0;
    return data;
}

答案 7 :(得分:0)

嗯,很难理解你所说的“操纵”可能意味着很多。
如果您不想保留原件,则可以按如下方式定义该功能:

void changeString(char* str);

如果你需要保留原文,那么你可能想要将内容复制到临时缓冲区,更改它并像这样返回:

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

使用最新方法确保正确跟踪分配的内存