【问题标题】:Function to reverse print反转打印功能
【发布时间】:2021-06-24 00:23:30
【问题描述】:

昨天我必须解决一个考试题,不幸的是,我失败了.. 练习是用 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);
}

我尝试了很长时间才能让它工作,但失败了。所以现在我正在为此烦恼。我做错了什么 ?我错过了什么?

提前致谢!

【问题讨论】:

  • 'i = 0;而(i)'......
  • 'ft_strlen()' 没用,为什么要贴出来?
  • 哎呀,重新创建它时出错

标签: c reverse c-strings function-definition


【解决方案1】:

您的 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);
}

【讨论】:

  • 谢谢你!不敢相信我错过了...... -_- 这太糟糕了......无论如何谢谢!
【解决方案2】:

首先,您的老师不够合格。函数应该至少声明为

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

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

你忘了调用函数ft_strlen

看来你的意思

i = ft_strlen( str );

结果这个循环

i = 0;
while (i)
{
    //...
}

永远不会执行,因为最初 i 等于 0 并且循环的条件立即评估为 false。

也在本次通话中

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

【讨论】:

  • 很棒的解释!谢谢!公平地说,他们实际上说字符串不能修改,但我忘了那个。所以我需要将 str 与它看起来的常量 char 进行比较。真的很有帮助!
【解决方案3】:

嘿,我已经尝试过您的问题,我想补充一点,在您的问题中,您已经写了字符串的长度以及代码中的以下部分:

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

不正确,所以我更正了它,基本上我们正在像这样添加先前字符的后面,并且错误出现在 while 循环条件中:

写 (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 */
}

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2018-07-10
    • 2019-12-29
    • 2014-11-29
    • 2022-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多