有人可以帮我弄清楚这个程序有什么问题吗? (C)

时间:2015-06-13 23:58:48

标签: c

我正在C中的/ r / dailyprogrammer上轻松挑战。我实际上设法编写了超过一百行的代码,并且总共花了几个小时(通常我最终会出局)并弄清楚所有代码编译器错误。但现在,当我运行它时,我立即得到了一个段错误。我做错了什么?

是的,这是家庭作业的帮助,但至少我在来这里之前试过。

#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define MAXLEN  50
#define LIMIT   20
#define TRUE    1
#define FALSE   0

char* reverse(char *a);
char* ltoa(long i);
long atol(char *a); /* NOTE: Handle leading zeros. */
long palindromize(long p);
int ispalindrome(long p);

/* Meat. */

int main(int argc, char *argv[])
{
    long p;
    int count, limr;

    p = (long) argv[1];
    count = 0;
    limr = FALSE;

    while (TRUE)
    {
        p = palindromize(p);
        count++;
        if (ispalindrome(p))
        {
            break;
        } else if (count == LIMIT) {
            limr = TRUE;
            break;
        }
    }

    if (limr)
    {
        printf("It might be a palindrome, but it'd take quite a while to find out.\nLast number reached: %ld\n", p);
    } else {
        printf("Palindrome found!  After %d steps, we've found %ld.\n", count, p);
    }
}

long palindromize(long p)
{
    return (atol(reverse(ltoa(p)))) + p;
}

int ispalindrome(long p)
{
    char *t, *r;

    t = ltoa(p);
    r = reverse(ltoa(p));

    if (t == r)
    {
        return TRUE;
    } else {
        return FALSE;
    }
}

/* Utility functions. */

/* Converts string to long integer. */
long atol(char *a)
{
    int i, sign;
    long r;

    for (i = 0; a[i] == '0'; i++)
    {
        i++;
    }

    if (a[0] == '-' || a[-1] == '-')
    {
        sign = -1;
    }
    else
    {
        sign = 1;
    }

    for (; isdigit(a[i]); i++)
    {
        r = 10 * r + (a[i] - '0');
    }

    return r * sign;
}

/* Converts long integer to string.
   This and reverse are based on the ones in K&R. */
char* ltoa(long n)
{
    char *a;
    int i, sign;

    if ((sign = n) < 0)
    {
        n = -n;
    }

    i = 0;
    do
    {
        a[i++] = n % 10 + '0';
    } while ((n /= 10) > 0);

    if (sign < 0)
    {
        a[i++] = '-';
    }
    a[i] = '\0';

    return reverse(a);
}

char* reverse(char *s)
{
    int i, j;
    char c;

    for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }

    return s;
 }

2 个答案:

答案 0 :(得分:0)

ltoa中,您声明char *a;,但永远不会malloc任何空间。当您访问a[i]时,它会崩溃。对于这样的问题,请记住一个简单的第一个调试步骤是在任何地方添加打印语句,以便至少可以确定错误发生的位置。

看起来您的ispalindrome也是错误的,但不是以段错误的方式。我会告诉你为什么= D

答案 1 :(得分:0)

char* ltoa(long n)
{
    char *a;
    int i, sign;

事实上,这是一个非常常见的错误。 char *a是指向字符的指针(可能是字符数组)。但是你没有告诉它内存中 字符的位置。所以它指向一些随机位置。

您可以使用char a[100]左右在本地保留字符,但这会让您在从函数返回时遇到问题。或者您可以使用char *a = (char *)malloc(100)保留记忆。或者您可以考虑对输入字符串本身进行回收,并将内存问题留给调用者。