用C语言处理字符串

用C语言处理字符串,c,arrays,string,pointers,C,Arrays,String,Pointers,披露:这是大学的工作。我并不期望代码能完成我的任务,而是想了解如何最好地在C语言中操作字符串 我需要编写一个函数以某种方式操作字符串(我不是说什么来确保没有人提供准确的代码) 在python中,我只需执行以下操作 def foo(str): return str 显然,事情并不像C中那样简单 谁能告诉我怎样才能最好地实现这一点。我是否应该使用指针来模拟按引用传递,并只操作原始字符串?任何帮助/资源都将不胜感激 更新:我确实希望对字符串执行一个操作,并返回该操作的结果(也是一个字符串)。我很

披露:这是大学的工作。我并不期望代码能完成我的任务,而是想了解如何最好地在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
有两种方法:

  • 如果操纵原始字符串,则不需要返回任何内容
  • 如果不想更改原始字符串,则应使用
    strdup
    malloc+strcpy
    复制它,并向其返回指针(
    char*
    )。调用方当然必须在完成后释放它
  • 这一切都取决于一个问题:调用方是否需要原始字符串?

    有两种方法:

  • 如果操纵原始字符串,则不需要返回任何内容
  • 如果不想更改原始字符串,则应使用
    strdup
    malloc+strcpy
    复制它,并向其返回指针(
    char*
    )。调用方当然必须在完成后释放它
  • 这一切都取决于一个问题:调用者是否需要原始字符串?

    这应该在C中工作:

    char* foo(char *str)
    {
      return str;
    }
    
    或者只是:

    void foo(char *str)
    {
    }
    
    因为你不是真的碰了str

    如果你想理解C,并且在没有帮助的情况下做作业,那就去给自己弄一份。马上

    这应该适用于C:

    char* foo(char *str)
    {
      return str;
    }
    
    或者只是:

    void foo(char *str)
    {
    }
    
    因为你不是真的碰了str


    如果你想理解C,并且在没有帮助的情况下做作业,那就去给自己弄一份。马上

    有很多约定,但最常见的似乎是:

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

    因此,您将原始字符串作为
    const
    传递到
    source
    (函数不会修改它),输出字符串写入
    destination


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

    有许多约定,但最常见的约定似乎是:

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

    因此,您将原始字符串作为
    const
    传递到
    source
    (函数不会修改它),输出字符串写入
    destination


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

    通常,函数应该使用
    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;
    }
    

    调用方负责
    释放
    返回的字符串。注意不要在循环中调用strlen。如果您多次需要它,请将其存储在类型为
    size\t

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

    调用方负责
    释放
    返回的字符串。注意不要在循环中调用strlen。如果您不止一次需要它,请将其存储在类型为
    size\t

    的临时变量中。如果我了解您想要什么,它将如下所示:

    void foo(char *str /* , int n */) {
        // do something
        // str[3] = 'c';
    }
    
    char* returnModified(char* str )
    {
          char* tmp = malloc(strlen(str));
          strcpy(tmp, str);
          // do watever
          return tmp;
    }
    
    请记住,不能超过为该字符串分配的空间。因此,可以选择int来指定长度

    如果要更改字符串,但仍将其保留在原始存储中,则需要执行此操作

    如果需要基于现有字符串的新字符串,则:

    char* foo(char *str /* , int n */) {
        char *ret = malloc(/* what you need */);
        // do something, probably copy str to ret
        return ret;
    }
    

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

    void foo(char *str /* , int n */) {
        // do something
        // str[3] = 'c';
    }
    
    char* returnModified(char* str )
    {
          char* tmp = malloc(strlen(str));
          strcpy(tmp, str);
          // do watever
          return tmp;
    }
    
    请记住,不能超过为该字符串分配的空间。因此,可以选择int来指定长度

    如果要更改字符串,但仍将其保留在原始存储中,则需要执行此操作

    如果需要基于现有字符串的新字符串,则:

    char* foo(char *str /* , int n */) {
        char *ret = malloc(/* what you need */);
        // do something, probably copy str to ret
        return ret;
    }
    

    我认为你的问题的答案是,你需要对字符串在C中的表示有一个基本的了解。一旦你了解了这一点,处理应该不再那么困难了

    我建议你读书

    (我能想到的第一个对我来说合理的url)


    祝你好运。

    我认为你的问题的答案是,你需要对字符串在C中的表示有一个基本的了解。一旦你了解了这一点,处理过程就不会那么困难了

    我建议你读书

    (我能想到的第一个对我来说合理的url)


    祝您好运。

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

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

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

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

    很难理解你所说的“操纵”意味着什么。
    如果不想保留原始函数,则可以按以下方式定义函数:

    void changeString(char* str);
    
    如果需要保留原始内容,则可能需要将内容复制到临时缓冲区,对其进行更改并按如下方式返回:

    void foo(char *str /* , int n */) {
        // do something
        // str[3] = 'c';
    }
    
    char* returnModified(char* str )
    {
          char* tmp = malloc(strlen(str));
          strcpy(tmp, str);
          // do watever
          return tmp;
    }
    

    使用最新的方法,确保正确跟踪分配的内存。好吧,很难理解“操纵”可能意味着很多。