问题 如何从C中的函数返回一个char数组


我想从函数返回一个字符数组。然后我想打印出来 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;
}

请告诉我,我做错了什么?


10826
2018-05-08 14:49


起源

你有任何错误吗? - Aswin Murugesh
你的编译器应该告诉你 test=substring(i,j,*s); 你解除引用了 s 什么时候不应该。 - Daniel Fischer
我收到一条错误消息:'substring'的冲突类型 - sayan
与错误无关,但我相信你的 (char*) 演员阵营是不必要的,乘以1是毫无意义的 - (j-i+1)*1 应简化为 j-i+1。 - Dukeling
除了其他注释之外,还需要添加一个null终止符 ch1 在循环结束时 substring - simonc


答案:


#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) 或者在main之前定义它

7
2018-05-08 15:10



它会编译好没有任何警告//1.>包含stdlib.h //2.>pass test = substring(i,j,s); //3.>删除m,因为它未使用//4.>声明char substring(int i,int j,char * ch)或在main之前定义它 - Coffee_lover
真有帮助。 - MELWIN
欢迎!:-) @MELWIN - Coffee_lover
只有我看到内存泄漏 test? (2。5年后;)) - Patryk
通过测试解决了内存泄漏问题。 - Coffee_lover


丹尼尔是对的: 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 // ...

4
2018-05-08 14:53



我得到整数类型数组的正确结果。但是,当我尝试使用char数组时,我只能获得错误 - sayan
我已相应地更改了代码,但却得到了同样的错误...... - sayan


评论中的懒惰笔记。

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

3
2018-05-08 15:04