C kodundaki hata nedir?

taxi driver

Hectopat
Katılım
6 Şubat 2020
Mesajlar
276
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Kodda segmantasyon hatası alıyorum. Eğer maindeki else yi if (argc != 2) yaparsam sıkıntı almıyorum.
Yardımcı olursanız sevinirim.
Kod:
#include <unistd.h>


int ft_atoi(char *str)


{


    int i = 0;


    int sig;


    int booba = 0;


    if(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))


        i++;


    while(str[i] == '-' || str[i] == '+')


    {


        if (str[i] == '-')


            sig = -1;


        i++;


    }


    while (str[i] >= '0' && str[i] <= '9')


    {


        booba = booba * 10 + str[i] - '0';


        i++;


    }


    return (booba);


}


void ft_putnbr(int n)


{


    if (n == -2147483648)


        write(1, "-2147483648", 11);


    else if (n < 0)


    {


        write(1, "-", 1);


        ft_putnbr(-n);


    }


    else if (n > 9)


    {


        ft_putnbr(n / 10);


        ft_putnbr(n % 10);


    }


    else


    {


        n = n + '0';


        write(1, &n, 1);


    }





}


int is_prime(int num)


{


    int i = 3;


   


    if (num <= 1)


        return (0);


    if (num % 2 == 0 && num > 2)


        return (0);


    while (i < (num / 2))


    {


        if (num % i == 0)


            return 0;


        i += 2;


    }


    return 1;


}


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


{


    int sum = 0;


    int nb = ft_atoi(argv[1]);


   


    if (argc == 2)


    {


        while (nb > 0)


            if (is_prime(nb--))


                sum += (nb + 1);


        ft_putnbr(sum);


    }


    else


        ft_putnbr(0);


    write(1, "\n", 1);


    return (0);


}
 
Son düzenleyen: Moderatör:
Kodda segmantasyon hatası alıyorum. Eğer maindeki else yi if (argc!= 2) yaparsam sıkıntı almıyorum.
Yardımcı olursanız sevinirim.
Kod:
#include <unistd.h>

int ft_atoi(char *str)

{

 int i = 0;

 int sig;

 int booba = 0;

 if(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))

 i++;

 while(str[i] == '-' || str[i] == '+')

 {

 if (str[i] == '-')

 sig = -1;

 i++;

 }

 while (str[i] >= '0' && str[i] <= '9')

 {

 booba = booba * 10 + str[i] - '0';

 i++;

 }

 return (booba);

}

void ft_putnbr(int n)

{

 if (n == -2147483648)

 write(1, "-2147483648", 11);

 else if (n < 0)

 {

 write(1, "-", 1);

 ft_putnbr(-n);

 }

 else if (n > 9)

 {

 ft_putnbr(n / 10);

 ft_putnbr(n % 10);

 }

 else.

 {

 n = n + '0';

 write(1, &n, 1);

 }

}

int is_prime(int num)

{

 int i = 3;

 if (num <= 1)

 return (0);

 if (num % 2 == 0 && num > 2)

 return (0);

 while (i < (num / 2))

 {

 if (num % i == 0)

 return 0;

 i += 2;

 }

 return 1;

}

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

{

 int sum = 0;

 int nb = ft_atoi(argv[1]);

 if (argc == 2)

 {

 while (nb > 0)

 if (is_prime(nb--))

 sum += (nb + 1);

 ft_putnbr(sum);

 }

 else.

 ft_putnbr(0);

 write(1, "\n", 1);

 return (0);

}

ChatGPT'ye sormayı deneyebilirsiniz.
 
Segmentation fault hatası, genellikle programın bellek hatası yaptığını gösterir. Bu hatayı almanın birkaç nedeni olabilir:

  1. Bellekte yasaklanmış bir adresi kullanıyor olabilirsin. Örneğin, 0 adresini veya bellekte yasaklanmış bir adresi kullanmaya çalıştığında bu hatayı alırsın.
  2. Bellekte yeterli miktarda yer olmadığında bu hatayı alırsın. Örneğin, malloc() fonksiyonu ile bellekte yer açmaya çalışırken, yeterli miktarda yer olmaması durumunda bu hatayı alırsın.
  3. Programda bir dizi sınırını aştığında bu hatayı alırsın. Örneğin, dizinin uzunluğunu aşan bir indise erişmeye çalıştığında bu hatayı alırsın.
Bu hatayı çözmek için, kodunu inceleyip bellek hatası yaptığını düşündüğün yerleri bulmalısın. Daha sonra, bu hataları düzeltmelisin.

Bellek hatası yaptığını düşündüğün yerleri bulmak için, programını Debug etmek veya hata ayıklayıcı kullanmak daha iyi bir seçenek olabilir. Bu sayede, programın hangi noktada hataya düştüğünü ve neden düştüğünü anlayabilirsin.

Chat GPT böyle anlattı bana buyurun.
 
C++:
#include <unistd.h>


int ft_atoi(char *str)
{
    int i = 0;
    int sig;
    int booba = 0;
    if(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
        i++;
    while(str[i] == '-' || str[i] == '+')
    {
        if (str[i] == '-')
            sig = -1;
        i++;
    }
    while (str[i] >= '0' && str[i] <= '9')
    {
        booba = booba * 10 + str[i] - '0';
        i++;
    }
    return (booba);
}
void ft_putnbr(int n)
{
    if (n == -2147483648)
        write(1, "-2147483648", 11);
    else if (n < 0)
    {
        write(1, "-", 1);
        ft_putnbr(-n);
    }
    else if (n > 9)
    {
        ft_putnbr(n / 10);
        ft_putnbr(n % 10);
    }
    else
    {
        n = n + '0';
        write(1, &n, 1);
    }
}
int is_prime(int num)
{
    int i = 3;
    if (num <= 1)
        return (0);
    if (num % 2 == 0 && num > 2)
        return (0);
    while (i < (num / 2))
    {
        if (num % i == 0)
            return 0;
        i += 2;
    }
    return 1;
}

int main(int argc, char *argv[])
{
    if(argc < 2)
    {
        return 0;
    }
    int sum = 0;
    int nb = ft_atoi(argv[1]);
    if (argc == 2)
    {
        while (nb > 0)
            if (is_prime(nb--))
                sum += (nb + 1);
        ft_putnbr(sum);
    }
    else
        ft_putnbr(0);
    write(1, "\n", 1);
    return (0);
}
Argümanlara erişim sağlamadan önce argüman verilmiş mi onu test etmeyi deneyin. Bu arada şu kodlarınızı atarken bi zahmet düzgün okunabilir şekilde yollayın.
 
Son düzenleme:
Bi siz zekisiniz.

C++:
#include <unistd.h>


int ft_atoi(char *str)
{
    int i = 0;
    int sig;
    int booba = 0;
    if(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
        i++;
    while(str[i] == '-' || str[i] == '+')
    {
        if (str[i] == '-')
            sig = -1;
        i++;
    }
    while (str[i] >= '0' && str[i] <= '9')
    {
        booba = booba * 10 + str[i] - '0';
        i++;
    }
    return (booba);
}
void ft_putnbr(int n)
{
    if (n == -2147483648)
        write(1, "-2147483648", 11);
    else if (n < 0)
    {
        write(1, "-", 1);
        ft_putnbr(-n);
    }
    else if (n > 9)
    {
        ft_putnbr(n / 10);
        ft_putnbr(n % 10);
    }
    else
    {
        n = n + '0';
        write(1, &n, 1);
    }
}
int is_prime(int num)
{
    int i = 3;
    if (num <= 1)
        return (0);
    if (num % 2 == 0 && num > 2)
        return (0);
    while (i < (num / 2))
    {
        if (num % i == 0)
            return 0;
        i += 2;
    }
    return 1;
}

int main(int argc, char *argv[])
{
    if(argc < 2)
    {
        return 0;
    }
    int sum = 0;
    int nb = ft_atoi(argv[1]);
    if (argc == 2)
    {
        while (nb > 0)
            if (is_prime(nb--))
                sum += (nb + 1);
        ft_putnbr(sum);
    }
    else
        ft_putnbr(0);
    write(1, "\n", 1);
    return (0);
}
Argümanlara erişim sağlamadan önce argüman verilmiş mi onu test etmeyi deneyin.
Hocam boş argüman girince segmantasyon alıyorum ama ben 0 yazdırmasını diliyorum. Bunu main kısmındaki else yerine if (argc != 2) yazarsam çözüyorum.
Ama ben neden burada else kullanamıyorum onu anlamadım ve size bunu soruyorum.
 
C++:
int main(int argc, char *argv[]) {
    int sum = 0;
    if (argc != 2) {
        ft_putnbr(0);
    } else {
        int nb = ft_atoi(argv[1]);
        while (nb > 0)
            if (is_prime(nb--))
                sum += (nb + 1);
        ft_putnbr(sum);
    }
    write(1, "\n", 1);
    return (0);
}
Bu şekilde çalışıyor mu peki?
 
C++:
int main(int argc, char *argv[]) {
    int sum = 0;
    if (argc != 2) {
        ft_putnbr(0);
    } else {
        int nb = ft_atoi(argv[1]);
        while (nb > 0)
            if (is_prime(nb--))
                sum += (nb + 1);
        ft_putnbr(sum);
    }
    write(1, "\n", 1);
    return (0);
}
Bu şekilde çalışıyor mu peki?
Argüman girince çalışıyor argüman girmeyince çalışmıyor.
Else durumunda sıkıntı çıkıyor.
 

Yeni konular

Geri
Yukarı