从 C 中的函数打印指针字符串 return

Print pointer string which is return from function in C

正在尝试编写一个 C 程序来反转给定的字符串(使用指针),这是代码。

[sample.c]

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

int _len(char s[])
{
    int i = 0;
    while (s[i++] != '[=11=]');
    return i;
}

char *_reverse(char s[])
{
    int len = _len(s);
    char *r = malloc(len * sizeof(char));
    for (int i=len-1; i >= 0; i--) {
        *r++ = s[i];
    }

    *r = '[=11=]';  // Line 21
    r -= len;   // Line 22
    return r;
}

int main(int argc, char *argv[])
{

    char s[10] = "Hello";
    printf("Actual String: %s\n", s);
    printf("Reversed: %s\n", _reverse(s));
    return 0;
}

当前O/P:

Actual String: Hello

Reversed: (null)

预期 O/P:

Actual String: Hello

Reversed: olleH

这里有什么错误或遗漏的..?请纠正我。提前致谢。

你在循环中增加 r,然后 return。显然,它指向的是实际反转字符串之后的地址。将 r 复制到 malloc 和 return 之后的另一个变量。

您正在修改新分配内存的指针“r”。因此,在反向函数的末尾,它仅指向您分配的缓冲区的末尾。 您可以通过以下方式将其移回开头:

r -= len;

但为了简化事情,我建议在开始时使用 i 和 len 来计算索引。

此外,您不要以 '\0' 终止反转的字符串。

首先是 _len 函数根据定义不正确,它应该排除最后一个 '[=13=]' 终止符(应该是:return i-1;)。另外上面已经指出了,需要使用不同的变量来遍历char *.

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

int _len(char s[]) {
    int i = 0;
    while (s[i++] != '[=10=]');
    return i-1;
}

char *_reverse(char s[]) {
    int len = _len(s);
    //printf("Len: %d\n", len);
    char *r =  (char *) malloc((len+1) * sizeof(char));
    char *ptr = r;
    for (int i=len-1; i >= 0; i--) {
        //printf("%d %c\n", i, s[i]);
        *(ptr++) = s[i];
    }
    *(ptr++) = '[=10=]';
    return r;
}

int main(int argc, char *argv[]) {
    char s[10] = "Hello";
    printf("Actual String: %s\n", s);
    printf("Reversed: %s\n", _reverse(s));
    return 0;
}
Actual String: Hello
Reversed: olleH

第一个函数实现

int _len(char s[])
{
    int i = 0;
    while (s[i++] != '[=10=]');
    return i;              // Old code
}

虽然没有标准的行为和声明,但或多或​​少是正确的。只是您必须考虑到返回值包括终止零。

因此内存分配

char *r = malloc(len * sizeof(char));

正确。

然而for循环中变量i的初始值

for (int i=len-1; i >= 0; i--) {

不正确,因为索引表达式 len - 1 指向将写入新字符串第一个位置的源字符串的终止零。结果,新数组将包含一个空字符串。

另一方面,此函数定义(更新后显示在 post 中)

int _len(char s[])
{
    int i = 0;
    while (s[i++] != '[=13=]');
    // return i;              // Old code
    return i == 0 ? i : i-1;  // Line 9 (Corrected)
}

没有多大意义,因为由于 while 循环中的 prost-increment 运算符,i 永远不会等于 0。而且现在内存分配

char *r = malloc(len * sizeof(char));

不正确。终止零字符 '[=25=]'.

没有 space

此外,在标识符前加下划线也不是一个好主意。这样的名字可以被系统保留。

函数可以通过以下方式声明和定义

size_t len( const char *s )
{
    size_t n = 0;

    while ( s[n] ) ++n;

    return n;
}

反转字符串不需要分配内存/如果你想创建一个新字符串并以相反的顺序复制源字符串,那么函数必须声明为

char * reverse( const char * s );

即参数应具有限定符 const。否则,如果没有限定符 const,函数声明就会令人困惑。函数的使用者可以认为是源字符串被反转了。

所以如果函数声明为

char * reverse( char *s );

那么可以这样定义。

char * reverse( char *s )
{
    for ( size_t i = 0, n = len( s ); i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s;
} 

如果您想以相反的顺序从源字符串创建一个新字符串,那么该函数可以类似于

char * reverse_copy( const char *s )
{
    size_t n = len( s );

    char *result = malloc( len + 1 );

    if ( result != NULL )
    {
        size_t i = 0;

        while ( n != 0 )
        {
            result[i++] = s[--n];
        }

        result[i] = '[=19=]';
    }

    return result;
}

当不再需要结果数组时,不要忘记释放 main 中的结果数组。

例如

char s[10] = "Hello";
printf("Actual String: %s\n", s);

char *t = reverse_copy( s );
printf("Reversed: %s\n", _reverse(t));
free( t );

Trying to write a C program to reverse the given string (using Pointer) and here is the code

如果您想在不使用下标运算符和索引变量的情况下定义函数,那么函数 lenreverse_copy 可以采用以下方式

size_t len( const char *s )
{
    const char *p = s;

    while (*p) ++p;

    return p - s;
}

char * reverse_copy( const char *s )
{
    size_t n = len( s );

    char *p = malloc( n + 1 );

    if (p)
    {
        p += n;
        *p = '[=21=]';

        while (*s) *--p = *s++;
    }

    return p;
}

并注意我的回答是最佳答案。:)