如何在C语言中从函数中返回一个char数组

17

我想从一个函数中返回一个字符数组,然后在main函数中打印它。我该如何将该字符数组回传到main函数?

#include<stdio.h>
#include<string.h>
int main()
{
    int i=0,j=2;
    char s[]="String";
    char *test;

    test=substring(i,j,*s);   
    printf("%s",test);
    return 0;
}


char *substring(int i,int j,char *ch)
{
    int m,n,k=0; 
    char *ch1;
    ch1=(char*)malloc((j-i+1)*1);
    n=j-i+1;

    while(k<n)
    {   
        ch1[k]=ch[i];
        i++;k++;
    }   

    return (char *)ch1;
}

请告诉我我做错了什么?


你有收到任何错误吗? - Aswin Murugesh
3
你的编译器应该已经告诉你了,在 test=substring(i,j,*s); 这一行中,你错误地对 s 进行了解引用操作。 - Daniel Fischer
我收到了一个错误信息:'substring'的类型冲突。 - sayan
1
与错误无关,但我认为你的 (char*) 强制转换是不必要的,并且乘以 1 是没有意义的 - (j-i+1)*1 应简化为 j-i+1 - Bernhard Barker
除了其他评论之外,在“substring”循环结束时,您需要向“ch1”添加一个空终止符。 - simonc
函数清理完毕后,它必须有一个存储位置,因此您必须使用malloc将返回值放在堆栈上。我看到有两个例子使用这种方法,但没有解释为什么。基本上,在函数执行完成后,函数内的所有内容都会消失,因此您需要分配一个内存区域,以便在函数返回后能够访问指向该数据的指针。 - MrMesees
3个回答

9
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *substring(int i,int j,char *ch)
{
    int n,k=0;
    char *ch1;
    ch1=(char*)malloc((j-i+1)*1);
    n=j-i+1;

    while(k<n)
    {
        ch1[k]=ch[i];
        i++;k++;
    }

    return (char *)ch1;
}

int main()
{
    int i=0,j=2;
    char s[]="String";
    char *test;

    test=substring(i,j,s);
    printf("%s",test);
    free(test); //free the test 
    return 0;
}

这段代码可以正常编译且不会有任何警告

  1. #include stdlib.h
  2. 使用test=substring(i,j,s)进行传递测试
  3. 删除未被使用的 m
  4. 要么在主函数之前声明char substring(int i,int j,char *ch),要么在主函数之前定义它

它会在没有任何警告的情况下编译通过 //1.>包括 stdlib.h //2.>传递测试=子字符串(i,j,s); //3.>删除未使用的 m //4.>要么声明 char substring(int i,int j,char *ch),要么在 main 之前定义它 - Coffee_lover
9
只有我看到了test上的内存泄漏吗?(已经2.5年了;)) - Patryk

5

注释中的惰性笔记。

#include <stdio.h>
// for malloc
#include <stdlib.h>

// you need the prototype
char *substring(int i,int j,char *ch);


int main(void /* std compliance */)
{
  int i=0,j=2;
  char s[]="String";
  char *test;
  // s points to the first char, S
  // *s "is" the first char, S
  test=substring(i,j,s); // so s only is ok
  // if test == NULL, failed, give up
  printf("%s",test);
  free(test); // you should free it
  return 0;
}


char *substring(int i,int j,char *ch)
{
  int k=0;
  // avoid calc same things several time
  int n = j-i+1; 
  char *ch1;
  // you can omit casting - and sizeof(char) := 1
  ch1=malloc(n*sizeof(char));
  // if (!ch1) error...; return NULL;

  // any kind of check missing:
  // are i, j ok? 
  // is n > 0... ch[i] is "inside" the string?...
  while(k<n)
    {   
      ch1[k]=ch[i];
      i++;k++;
    }   

  return ch1;
}

4

Daniel是对的:http://ideone.com/kgbo1C#view_edit_box

更改

test=substring(i,j,*s);

为了

test=substring(i,j,s);  

此外,您需要提前声明子字符串:
char *substring(int i,int j,char *ch);

int main // ...

我在整数类型的数组中得到了正确的结果。但是当我尝试使用字符数组时,只会出现错误。 - sayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接