-6

好的,所以我正在学习 C,我尝试使用简单的函数来理解基础知识,在这里我遇到了分段错误,我无法使这段代码工作 h3lp,谢谢大家!

#include <stdio.h>

#include <stdlib.h>

int     ft_sqrt(int nb) //square root
{
        unsigned int i;

        i = nb;

        while (nb < (i * i))
            i--;
        if (nb == (i * i))
            return (i);
        if (nb > (i * i))
            return (0);
}

void    ft_strcpy(char *d, char *s) // string copy
{
        while((*d++ == *s++))
            ;
}

int     ft_strlen(char *s) // string length
{
        int i = 0;
        while(s[i] != '\0')
            i++;
        return (i);
}

char    *ft_itoa(int n)  // integer to ascii
{
        char    *s;

        s = (char *)malloc(99);
        s += ft_strlen(s);
        *s = 0;
        while((*--s == n % 10 + '0') && (n /= 10))
            ;
        return (s);
}

int     ft_atoi(char *s)  //ascii to integer
{
        int i = 0;
        while(*s)
            i = 10 * i + *s++ - '0';
        return (i);
}

int     main()
{
        int     ft_sqrt(int nb);
        void    ft_strcpy(char *d, char *s);
        char    *ft_itoa(int n);
        int     ft_atoi(char *s);
        int     ft_strlen(char *s);

        int     a, *x;
        a = 0;
        char    c[40], d[4];
        c[40] = 0;
        d[4] = 0;

        a = ft_sqrt(1764);  //42 in a
        ft_strcpy(d, ft_itoa(a));  // a in d
        ft_strcpy(c, "The square root of 1764 is: ");
        x = ft_atoi(d);
        printf("\n\n\t%s%sand%cin ascii\n\n\n", c, d, x);



        return 0;
}

只是破解我的代码只是想学习!

4

2 回答 2

0

您的代码中有很多错误

  1. nb不是a时,它将永远给出。自己试试。改为使用(在math.h头文件下可用)perfect square number0sqrt()

  2. ft_strcpy()的框架不正确,请改用strcpy()string.h头文件下。原型void strcpy(char *str1, char *str2),这里的内容str2将被复制到str1.

  3. char *ft_itoa(int n)可能无法正常工作,因为您提供了错误的值,ft_strlen()这可能会导致错误的值被添加到指针中*s为什么?想想你自己,我不会告诉你这个基本概念)。

请重新编码您的程序,如果仍然无法修复错误,请告诉我。

于 2015-07-29T07:13:40.017 回答
0

嘿@BLUEPIXY 感谢您帮助您修复了我的 atoi !@psyco 谢谢你,这是我的代码,顺便说一句,对于 *ft_itoa(int n) 具有与 ft_strlen() 相同的值。

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

int     ft_sqrt(int nb)
{
        unsigned int i;

        i = nb;

        while (nb < (i * i))
            i--;
        if (nb = (i * i))
            return (i);
        if (nb > (i * i))
            return (0);
}    

void    ft_strcpy(char *d, char *s)
{
        while((*d++ = *s++))
            ;
} 

int     ft_strlen(char *s)
{
        int i = 0;
        while(s[i] != '\0')
            i++;
        return (i);
}

char    *ft_itoa(int n)
{
        char    *s;

        s = (char *)malloc(99);
        s += ft_strlen(s);
        *s = 0;
        while((*--s = n % 10 + '0') && (n /= 10))
            ;
        return (s);
}

int     ft_atoi(char *s)
{
        int i = 0;
        while(*s)
            i = 10 * i + *s++ - '0';
        return (i);
}

int     main()
{
        int     ft_sqrt(int nb);
        void    ft_strcpy(char *d, char *s);
        char    *ft_itoa(int n);
        int     ft_atoi(char *s);
        int     ft_strlen(char *s);

        int     a;
        a = 0;
        char    c[40], d[4];
        c[40] = 0;
        d[4] = 0;

        a = ft_sqrt(1764);
        ft_strcpy(d, ft_itoa(a));
        ft_strcpy(c, "The square root of 1764 is: ");
        printf("\n\n\t%s%s and %c in ascii\n\n\n", c, d, ft_atoi(d));

        return 0;
}

已修复Bug 谢谢大家

于 2015-07-29T10:00:01.693 回答