Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中反转字符串(不在适当的位置)?_C_String - Fatal编程技术网

如何在C中反转字符串(不在适当的位置)?

如何在C中反转字符串(不在适当的位置)?,c,string,C,String,我已经搜索过了,但我能找到的只是一个函数在什么地方反转字符串。以下是我目前掌握的情况: char* reverseString(char* string) { int i, j; char reversed[sizeof(string)]; j = strlen(string); for (i = strlen(string); i >= 0; i--) { reversed[j - i] = string[i]; }

我已经搜索过了,但我能找到的只是一个函数在什么地方反转字符串。以下是我目前掌握的情况:

char* reverseString(char* string)
{
    int i, j;
    char reversed[sizeof(string)];
    j = strlen(string);

    for (i = strlen(string); i >= 0; i--)
    {
        reversed[j - i] = string[i];
    }
    return reversed;
}
然而,这就碰到了反转成为局部变量的问题,因此返回指向它的指针会引发

warning: function returns address of local variable [enabled by default]

首先,表达式
sizeof(string)
返回指针的大小,而不是字符串的长度。也可以使用strlen(string)。正如ta.speot所指出的,您需要为终止的
'\0'
添加一个字符,并将该终止符添加到反向字符串中


至于您的问题,变量
reversed
存储在堆栈上,当函数返回时,内存区域不再可用。您必须在堆上分配内存,例如使用
malloc
(稍后使用
free
)释放内存,或者使变量
成为静态的
,但在这种情况下,您不能在多线程程序中使用它。

首先,表达式
sizeof(string)
返回指针的大小,不是字符串的长度。也可以使用strlen(string)。正如ta.speot所指出的,您需要为终止的
'\0'
添加一个字符,并将该终止符添加到反向字符串中


至于您的问题,变量
reversed
存储在堆栈上,当函数返回时,内存区域不再可用。您必须在堆上分配该内存,例如使用
malloc
(稍后使用
free
)释放该内存,或者使变量
成为静态的
,但在这种情况下,您不能在多线程程序中使用该变量。

您可以为其动态分配内存:

char* reverseString(char* string)
{
    int i;
    int j = strlen(string);
    char *reversed = malloc(j + 1);
    ...
在这种情况下,调用方必须记住释放()返回的已分配缓冲区

或者,您可以让调用者传入一个足够大的缓冲区,以容纳反转的字符串:

char* reverseString(char* string, char *reversed)
{
     int i, j;
     j = strlen(string);

     for (i = strlen(string); i >= 0; i--)
     {
 ...
还请注意,在当前代码中:
charreversed[sizeof(string)]是错误的,

在这个函数中,
string
只是一个
char*
,因此
sizeof(string)
给出了一个
char*
的大小,而不是这个char*指向的字符串的长度。

您可以为它动态分配内存:

char* reverseString(char* string)
{
    int i;
    int j = strlen(string);
    char *reversed = malloc(j + 1);
    ...
在这种情况下,调用方必须记住释放()返回的已分配缓冲区

或者,您可以让调用者传入一个足够大的缓冲区,以容纳反转的字符串:

char* reverseString(char* string, char *reversed)
{
     int i, j;
     j = strlen(string);

     for (i = strlen(string); i >= 0; i--)
     {
 ...
还请注意,在当前代码中:
charreversed[sizeof(string)]是错误的,

在这个函数中,
string
只是一个
char*
,因此
sizeof(string)
提供了一个
char*
的大小,而不是这个char*指向的字符串的长度。

您可以使用malloc为反向字符串分配空间,也可以让调用者为新字符串提供空间。 后者通常可以降低编程错误导致内存泄漏的风险

void reverseString(char *reversed, char *string)
{
    int i, j;
    j = strlen(string);

    for (i = strlen(string) - 1; i >= 0; i--)
    {
        reversed[i] = string[j-i];
    }
    reversed[j] = 0;  /* Don't forget to nul-terminate the reversed string */
}

您可以使用malloc为反转字符串分配空间,也可以让调用者为新字符串提供空间。 后者通常可以降低编程错误导致内存泄漏的风险

void reverseString(char *reversed, char *string)
{
    int i, j;
    j = strlen(string);

    for (i = strlen(string) - 1; i >= 0; i--)
    {
        reversed[i] = string[j-i];
    }
    reversed[j] = 0;  /* Don't forget to nul-terminate the reversed string */
}

如果不想在函数中分配,只需提供目标缓冲区,然后返回该缓冲区。然后,责任由调用方承担,调用方的大小足以容纳源代码

char* reverseString(char* source, char* reversed) {...}

是的,sizeof不是检查字符串大小的正确方法,请使用strlen()

如果不想在函数中分配,请提供目标缓冲区,然后返回该缓冲区。然后,责任由调用方承担,调用方的大小足以容纳源代码

char* reverseString(char* source, char* reversed) {...}

是的,sizeof不是检查字符串大小的正确方法,请使用strlen()

获取指向
反转的指针作为参数,并在此函数中定义它。@saeedn还有其他方法吗?我更喜欢在函数中创建变量并返回它/它的值,除了警告代码有更多问题之外。1.分配的缓冲区大小不正确。您需要分配
strlen(字符串)+1
字节。2.复制循环中的数组索引关闭1,并将nul终止符放在反向字符串的第一位。3.无法将nul终止符放在反向字符串的末尾。如果要在函数中创建它,可以在堆上分配
reversed
(使用
malloc
),并返回它的指针将指向
reversed
的指针作为参数,并从该函数中定义它。@saeeden有其他方法吗?我更喜欢在函数中创建变量并返回它/它的值,除了警告代码有更多问题之外。1.分配的缓冲区大小不正确。您需要分配
strlen(字符串)+1
字节。2.复制循环中的数组索引关闭1,并将nul终止符放在反向字符串的第一位。3.无法将nul终止符放在反向字符串的末尾。如果要在functionAh中创建它,可以在堆上分配
reversed
(使用
malloc
),并返回其指针。那么,如何使内存永久化,而不是在函数返回后消失?@ChintanParikh要么在堆上声明它,要么使用静态内存,要么将指针作为参数传递。啊,我明白了。那么,如何使内存永久化,而不是在函数返回后消失?@ChintanParikh要么在堆上声明它,要么使用静态内存,要么将指针作为参数传递。