我已经搜索过了,但我能找到的就是一个函数来反转字符串。这是我到目前为止所做的:
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]
答案 0 :(得分:2)
首先,表达式sizeof(string)
返回指针的大小,而不是字符串的长度。也可以使用strlen(string)
。并且如ta.speot.is所述,您需要为终止'\0'
添加一个字符,并将该终结符添加到反向字符串。
至于你的问题,变量reversed
存储在堆栈中,当函数返回时,你的内存区域不再可用。你要么必须在堆上分配那个内存,例如malloc
(并稍后使用free
释放该内存)或创建变量static
,但在这种情况下,您无法在多线程程序中使用它。
答案 1 :(得分:2)
您可以为它动态分配内存:
char* reverseString(char* string)
{
int i;
int j = strlen(string);
char *reversed = malloc(j + 1);
...
在这种情况下,调用者必须记住free()返回的已分配缓冲区。
或者你可以让调用者传入一个足够大的缓冲区来保存反向字符串:
char* reverseString(char* string, char *reversed)
{
int i, j;
j = strlen(string);
for (i = strlen(string); i >= 0; i--)
{
...
另请注意,在您当前的代码中:char reversed[sizeof(string)];
错误,
在此函数string
中只有一个char*
,因此sizeof(string)
为您提供char*
的大小,而不是此char *指向的字符串的长度。
答案 2 :(得分:1)
您可以使用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 */
}
答案 3 :(得分:0)
如果您不想在函数中分配然后返回,请提供目标缓冲区。然后由呼叫者负责,其反向大到足以适合来源。
char* reverseString(char* source, char* reversed) {...}
并且yes sizeof不是检查字符串大小的正确方法,请使用strlen()