我想知道(我试图编程冻结)如果有办法创建一个返回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 ;
}
答案 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)