函数实现倒序打印

3
昨天我必须解决一道考试题目,但很遗憾,我失败了。 这个问题是要创建一个C函数,并遵循以下规则:
  • 编写一个函数,该函数接受一个字符串并将该字符串反向显示,然后加上换行符。
  • 它的原型构建如下:char *ft_rev_print(char *str)
  • 它必须返回其参数
  • 只允许使用函数“write”(因此不能使用printf或其他函数)
有了这些信息,我写了以下内容:
int     ft_strlen(char *str) /*to count the length of the original string*/
{
    int     i;
    i = 0;
    while (str[i])
            i++;
    return (i);
}
char    *ft_rev_print (char *str)
{
    int     i;

    i = ft_strlen(str);
    while (i)
    {
            write (1, (str +1), 1);
            i--;
    }
    return (str);             /*returning its argument */
}

int     main(void)     /*IT HAD TO WORK WITH THIS MAIN, DID NOT WROTE THIS MYSELF!*/
{
    ft_rev_print("rainbow dash");
    write(1, "\n", 1);
    return (0);
}

我试了很久,但无法使其正常工作。现在我正在为此烦恼。我做错了什么?我错过了什么?

提前致谢!


1
'i = 0; while (i)'...... - Martin James
'ft_strlen()'没有被使用,那为什么要发布它呢? - Martin James
哎呀,重新创建时出了一些错误。 - πrre
3个回答

3
你的while循环不正确,你从i=0开始迭代,而且只要它不为零就会迭代,因此不会执行任何迭代。
你应该这样做:
  • 初始化i为最后一个字符的索引
  • 只要它是有效索引,就循环
  • 打印第i个字符,而不总是第二个(索引1)
char *ft_rev_print (char *str)
{
    int i;

    i = ft_strlen(str) - 1; // <-- Initialize i to be the index of the last character
    while (i >= 0) // <-- Loop as long as it's valid
    {
        write (1, (str+i), 1); // <-- Print the i-th character
        i--;
    }
    return (str);
}

谢谢,伙计!我简直不敢相信我错过了那个……-_- 这太糟糕了……无论如何还是谢谢!! - πrre

2

首先,你的教师资质不够。该函数至少应该声明为:

char * ft_rev_print( const char *str );
                     ^^^^^

因为传递的字符串在函数内没有被改变。

你忘记调用函数ft_strlen

看起来你的意思是

i = ft_strlen( str );

作为结果,这个循环
i = 0;
while (i)
{
    //...
}

这段代码中,由于循环开始时i等于0,所以条件判断为假,导致循环体从未执行。

同样,在此调用中

write (1, (str +1), 1);
          ^^^^^^^^

您总是试图输出字符串的第二个符号。

根据其描述,换行字符'\n'的输出应该在函数内部。

该函数可以如下所示(在下面的演示程序中,我将使用非标准函数write的函数putchar,但您可以自行替换为write)。

#include <stdio.h>

char * ft_rev_print( const char *str )
{
    const char *p = str;
    
    while ( *p ) ++p;
    
    while ( p != str ) putchar( *--p );  // substitute the call of putchar for write( 1, *--p, 1 )
    
    putchar( '\n' );  // substitute the call of putchar for write( 1, "\n", 1 )
    
    return ( char * )str;
}

int main(void) 
{
    ft_rev_print( "rainbow dash" );
    
    return 0;
}

程序输出为:
hsad wobniar

非常棒的解释!谢谢!说实话,他们确实说过字符串是不可修改的,但我忘了这一点。所以似乎需要将字符串与一个常量字符进行比较。 真的很有帮助! - πrre

1

嘿,我尝试了你的问题,有一个小细节我想补充一下,在你的问题中,你写了字符串的长度并且在你的代码中也有以下部分:

  write (1, (str +1), 1);

原本是错误的,我进行了修正,基本上我们是在添加先前字符的背面,就像这样,在 while 循环条件中出现了错误:

write (1,(str + i),1);

您可以在此处查看完整的原型:

char    *ft_rev_print (char *str)
{
    int     i;
     i = ft_strlen(str);//returning the length of string
     while (i>=0)
     {
            write (1,(str+i),1);
            i--;
     }
    return (str);             /*returning its argument */
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接