我正在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;
}
答案 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)
保留记忆。或者您可以考虑对输入字符串本身进行回收,并将内存问题留给调用者。