我可以使用char []或char *作为函数的返回值吗?

时间:2017-02-20 06:13:12

标签: c arrays char return-type function-calls

我想知道(我试图编程冻结)如果有办法创建一个返回char *或char []的函数,那么我不必修改我发送到的字符串功能,学习如何使我的代码更有说服力。

#include <stdio.h>
#define LOW_LETTERS 97
#define CAP_LETTERS 65
#define N_LETTERS 26
#define DIFF 32
#define NUMBERS 48
#define N_DIGITS 9


void transformText ( char text[] )
{
    for ( int i = 0 ; text[i] != '\0' ; i++ )
    {
        if ( ( text[i] >= LOW_LETTERS ) && ( text[i]  <= LOW_LETTERS + N_LETTERS ) )
            text[ i ] = text [ i ] - DIFF ; //same letter, but upper case
        else
            if ( ( text [ i ] >= CAP_LETTERS ) && ( text[i] <= CAP_LETTERS + N_LETTERS ) )
                text [ i ] = text [ i ] + DIFF ; //same letter, but lower case
            else
                if ( text [i] >= NUMBERS && text[i] <= NUMBERS + N_DIGITS )
                    text[i] = '*'; //turns every number to a '*'
    }

}

int main (void)
{
    char text[] = "foOo123Oo44O99oO00" ;
    transformText ( text ) ;
    printf ( "%s\n", text ) ; //prints FOoO***oO**o**Oo**

    return 0 ;
}

这就是我解决它的方式,我想我有一个内存泄漏的想法,不是吗?请注意,我没有修改原始字符串,这是我打算做的,我也不知道将free(newText)置于何处以便识别,但仍可用于main()

#include <stdio.h>
#define LOW_LETTERS 97
#define CAP_LETTERS 65
#define N_LETTERS 26
#define DIFF 32
#define NUMBERS 48
#define N_DIGITS 9
#define BUFFER 128


char* transformText ( char text[] )
{
    char *newText = (char *) malloc (BUFFER) ;
    for ( int i = 0 ; text[i] != '\0' ; i++ )
    {
        if ( ( text[i] >= LOW_LETTERS ) && ( text[i]  <= LOW_LETTERS + N_LETTERS ) )
            newText[ i ] = text [ i ] - DIFF ; //same letter, but upper case
        else
            if ( ( text [ i ] >= CAP_LETTERS ) && ( text[i] <= CAP_LETTERS + N_LETTERS ) )
                newText [ i ] = text [ i ] + DIFF ; //same letter, but lower case
            else
                if ( text [i] >= NUMBERS && text[i] <= NUMBERS + N_DIGITS )
                    newText[i] = '*'; //turns every number to a '*'
                else
                    newText[i] = text[i] ;
    }

    return newText ;
}

int main (void)
{
    char text[] = "foOo123Oo44O99oO00" ;

    printf ( "%s\n", transformText ( text ) ) ; //prints FOoO***oO**o**Oo**
    return 0 ;
}

4 个答案:

答案 0 :(得分:1)

一般来说,是的,拥有一个返回char *的函数你都很好,但你需要注意一些事情,比如

  • 您需要确保不将本地变量的地址返回给被调用的函数。这将产生在调用者中使用无效内存的问题。最好的方法是使用malloc()或family分配内存并返回指针。一旦你完成使用它,你还需要free()内存。
  • 如果您要使用返回的指针,则需要确保返回指针的有效性。

编辑:

因此,一旦你在调用者中获得了返回的指针并完成了它的使用,你需要通过调用free()释放先前分配的内存并传递指针。在你的情况下,它应该看起来像

char * res = transformText ( text );
printf ( "%s\n", res );   // use the returned pointer
free(res);                                  // release memory
return 0 ;                                   // done

答案 1 :(得分:1)

由于函数无法返回数组,因此需要从堆返回指针。您无法返回数组的原因是因为它们在堆栈上声明,并在函数返回时被擦除。而如果您返回指针,则可以在整个程序中共享此指针。

您的代码大致如下:

char* transformText(const char text[]) {
    char *result = malloc(........);
    /* check malloc */
    /* more code */
    return result;
}

int main(void) {
    const char text[] = "foOo123Oo44O99oO00";
    char *result = transformText(text);
    /* do more stuff */

    /* deallocate pointer */
    free(result);
}

这是另一个示例,显示您仍然可以使用void()作为您的函数,而不是返回任何内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void allocate(const char text[], char **result) {
    *result = malloc(strlen(text)+1);
}

int main(void) {
    const char text[] = "foOo123Oo44O99oO00";
    char *result; 

    allocate(text, &result);
    strcpy(result, text);

    printf("%s\n", result);

    free(result);

    return 0;
}

答案 2 :(得分:0)

通常,您不希望从函数返回char*。在您的情况下这样做没有明显的好处。

替代方案要么让调用者复制一份:

const char text[] = "foOo123Oo44O99oO00";
char text_copy [strlen(text)+1];
memcpy(text_copy, text, sizeof(text));
transformText (text_copy);

或让功能完成:

void transformText (char* dst, const char* src)
{
  // iterate over src
  // store result in dst
}

动态分配在这里没有明显的原因。使用动态内存而不是听起来像是由程序设计错误引起的副作用。应该避免返回指向动态内存的指针,因为它可能会导致内存泄漏。

尽可能将分配留给来电者。

答案 3 :(得分:-3)

非常直接:

$located=$this->select_model->teacher_with_subject();

返回相同的值: enter image description here