打印由循环内部函数返回的指针

时间:2014-06-16 22:51:43

标签: c++ pointers

我正在创建一个c ++程序,它将使用“%20”替换char数组中的所有空格。 例如,“这是一些带有一些空格的文本”将转换为“此%20is%20some%20text%20with%20some%20spaces”

请参阅线路不正常的节目评论。

此程序中的

replacer函数将指针指向char数组和字符串的大小。 然后方法创建具有替换空格的新char数组,函数返回指向替换char数组的指针。

这个程序的问题在于main函数中的print char数组,其指针由replacer返回。

“被替换”是指向被替换字符串的指针变量。在main函数中,我试图使用“替换”指针打印char数组。

如果我手动打印所有内容,它可以正常工作。 例如,如果我这样做:cout << *replaced << *(replaced+1) << *(replaced+2) .... 将打印整个字符串。

但是内部循环它给了我垃圾价值。请告诉我代码中的哪个地方我犯了什么错误。谢谢。

Screenshot of execution of program

#include <iostream>

using namespace std;

char * replacer(char * text, unsigned int size )
{
    int space_count = 0, i = 0, new_size = 0;
    cout << "Given text : ";
    for(i = 0;i < size;i++)
    {
        cout << *(text + i) ;
        char temp = *(text + i);
        if (temp == ' ')
        {
            space_count++;
        }
    }
    cout << endl;
    cout << "Number of spaces in given text : " << space_count << endl;
    new_size = size + ( 2 * space_count );

    char replaced_string[new_size];
    int counter = 0 ;
    for(i = 0 ;i < size; i++)
    {
        char temp = *(text + i);
        if(temp == ' ')
        {
            replaced_string[counter++] = '%';
            replaced_string[counter++] = '2';
            replaced_string[counter++] = '0';
        }
        else
        {
            replaced_string[counter++] = temp;
        }
    }
    cout << "in replacer method : " << replaced_string << endl;
    char * pointer_to_replaced;
    pointer_to_replaced = replaced_string;
    return pointer_to_replaced;
}

int main()
{
    int t;
    char original[] = "This is some text with some spaces";
    char * original_pointer = original;
    char *replaced;
    replaced = replacer(original_pointer, sizeof(original));
    //cout << *(replaced) << *(replaced+1) << *(replaced+2) << *(replaced+3) << *(replaced+4) << endl;
    // ABOVE LINE WORKS FINE
    for(t=0;t<20;t++)
    {
        cout<<*(replaced+t);  // THIS IS NOT WORKING PROPERLY
    }
    cout <<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

第一个问题是你在堆栈上分配replaced_string,然后期望它在从函数返回后保留其值。你应该在堆上进行分配,然后记住delete[]内存。当函数返回时,堆栈消失。

//    char replaced_string[new_size];
    char* replaced_string = new char[new_size];

第二个问题是你需要在循环后空终止replaced_string

replaced_string[counter] = '\0';

此外,您无需循环以打印返回值。您可以直接使用cout

cout << replaced << endl;

也可能存在其他潜在问题,但修复这三个问题会使代码生效。