【问题标题】:Custom Reverse and strlen functions in CC中的自定义反向和strlen函数
【发布时间】:2017-11-23 14:21:02
【问题描述】:

我的任务是 函数逆向的实现。在实现函数时,禁止使用C语言库的函数。 有人可以帮我实现函数strlen吗?

我的功能:

void revstr( char * str){
    int i, len = 0;

    len = strlen(str);

    for (i = 0; i <= len / 2; i++){
        *(str + len - i) = *(str + i);  
        *(str + i) = *(str + len - i - 1);
    } 


    for (i = len / 2; i <= len; i++)
        *(str + i) = *(str + i + 1);

}

【问题讨论】:

  • strlen 对字符进行计数,直到到达字符 0x00。我想这些信息就足够了。
  • *(str + len - i) 等是不可读的。使用str[len - i]
  • 编写代码 rhat 交换两个值(例如字符)。测试,然后再测试一些,确保它有效,然后继续写reverse
  • @bolov 这是一个家庭作业,我发现这个语法对学习指针运算很有用。
  • 谁能帮我实现strlen函数? stackoverflow.com/questions/39438991/…

标签: c


【解决方案1】:

strlen 返回字符串的长度。所以你可以遍历整个字符串,增加一个计数器并将计数器作为长度返回

代码:

size_t my_strlen(char *str) {
    size_t i;
    for (i = 0; str[i] != '\0'; i++) 
        ;
    return i;
}

编辑:

您的 revstr 代码似乎非常复杂。这是一个简单的方法。

char * revstr( char * str)
{
    int i,end,len;
    char temp;

    len= my_strlen(str);
    end = len-1;
    for(i=0;i<len/2;i++)
    {
       temp=str[i];
       str[i]=str[end];
       str[end--]=temp;
    }

    return str;
}

注意:最好写str[i] 而不是*(str + i)。 并且代码非常适合您的问题:)

【讨论】:

  • 感谢您的建议!
  • 你可以使用int end = my_strlen(str) - 1; for (int i = 0; i &lt; end; i++, end--) { …swap… }
【解决方案2】:

我认为使用标准库函数从来没有“禁止”,在这里使用strlen() 很好。他们没有必要自己写。至于你的反向功能,我建议你分解问题。

一个简单的方法是有两个计数器,一个从字符串的开头开始,一个从字符串的结尾开始。您需要交换这些字符,可以这样完成:

void swap(char *a, char *b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

一旦这些开始和结束字符被交换,增加开始计数器并减少结束计数器以向内移动字符串,然后再次交换。这可以写成一个简单的循环:

for (start = 0, end = len-1; start <= end; start++, end--) {
    swap(&string[start], &string[end]);
}

我会让你填写其余的代码,但这给出了大致的想法。

【讨论】:

  • 在家庭作业中,通常会禁止特定的标准功能。
【解决方案3】:

我是这样做的:

void revstr(char *str)
{
    char *s = str;
    char *e;

    for (e=s; *e; ++e); //find the end

    if (e==s)
        return; //empty string

    for (--e; e>s; --e,++s)
    {
        char t = *s;
        *s = *e;
        *e = t;
    }
}

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多