从函数返回char *

时间:2018-05-08 08:21:08

标签: c++ char

我试图从一个函数中返回一个char *,该函数通过获取给它的两个字符串的一部分来形成一个字符串。该字符串必须以char *的形式返回。但是,当我运行以下代码时,不会打印输出。请帮忙解决这个问题。

#include <iostream>
#include<string.h>
using namespace std;

char *findpass(char *s1, char*s2)
{
    int sl1 = strlen(s1);
    int sl2 = strlen(s2);
    int i = 0, in = 0;
    char temp[100];
    char *t;
    if (sl1 % 3 == 0)
    {
        for (i = 0; i<sl1 / 3; i++)
        {
            temp[in] = *(s1 + i);
            in++;
        }
    }
    t = temp;
    return t;
}

int main()
{
    char i1[10], i2[10];
    char *f1, *f2;
    cin >> i1 >> i2;
    f1 = i1;
    f2 = i2;
    char *f = findpass(f1, f2);
    cout << f;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

你的char temp[100];是局部变量,它会在离开范围后被销毁,因此t = temp;将指向一个混乱的数据。 您需要为char *temp = new char[100];分配内存然后在临时t = temp;上指向t。你也可以return temp;。但之后不要忘记通过delete []解除分配的内存。看看这个例子:

char *findpass(char *s1,char*s2)
{
    int sl1=strlen(s1);
    int sl2=strlen(s2);
    int i=0,in=0;
    char *temp = new char[100];
    char *t;
    if(sl1%3==0)
    {
        for(i=0;i<sl1/3;i++)
        {
            temp[in]=*(s1+i);
            in++;
        }
    }
    t=temp;
    return t;
}

当用测试输入数据调用时,我们有:

int main()
{
    char temps1[] = "123456789";
    char temps2[] = "abc";

    char* retVal = findpass(temps1, temps2);
    std::cout << retVal <<std::endl; // prints 123

    //Deallocate allocated memory before
    delete [] retVal;

    return 0;
}

输出是:

123

答案 1 :(得分:0)

#include <iostream>
#include <cstring>
using namespace std;
char *findpass(char *s1,char*s2)
{
    int sl1=strlen(s1);
    int sl2=strlen(s2);
    int i=0,in=0;
    char temp[100];

    if(sl1%3==0)
    {
        for(i=0;i<sl1/3;i++)
        {
            temp[in]=*(s1+i);
            in++;
        }
    }
    cout<<temp<<endl;
    char *t= new char [strlen(temp)+1]; // added dynamic memory allocation
    strcpy(t,temp); // copy temp to t;

    return t;
}

需要使用动态内存分配从函数返回char *;

int main()
{
   char i1[10],i2[10];
   char *f1,*f2;
   cin>>i1;
   cin>>i2;
   f1=i1;
   f2=i2;
   char *f = findpass(f1,f2);
   cout<<f;
   delete []f;  // delete dynamic memory allocation to avoid memory leak
   return 0;
}