2012-03-06 49 views
0

我正在为下面的代码获取分段错误。编译我输入gcc -std=c99 -g alphacode.c。这是我从here解决的问题,我不确定问题是什么。我的c代码有什么问题?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 

int catchar(char a, char b) { 

    char a1[2]; 
    a1[1] = a; 
    a1[0] = b; 

    return atoi(a1); 
} 

int processNumber(char *num) { 
int size = strlen(num); 
int p[size]; 

if (num[size-1] != 0) 
    p[size-1] = 1; 
else 
    p[size-1] = 0; 

int i; 
for (i = size-2; i>=0; i--) 
    { 

     if (catchar(num[i], num[i-1]) > 26 || 
     catchar(num[i] , num[i-1]) <1 || num[i] == 0) 
    p[i] = p[i-1];  
     else 
    p[i] = p[i-1] + p[i-2]; 

    } 

return p[0]; 

} 


int main() { 

    int bytes_read; 
    int nbytes = 5000; 
    char *number; 
    bytes_read = getline (&number, &nbytes, stdin); 
    while (bytes_read != -1) { 

     int out = processNumber(number); 
     printf("%d\n", out); 
     bytes_read = getline (&number, &nbytes, stdin); 

    } 
    return 0; 
} 
+1

在程序上运行[gdb](http://www.gnu.org/software/gdb/),它会告诉你到底发生了段错误的位置。 – Sjoerd 2012-03-06 10:45:24

+0

@Sjoerd:GDB抱怨:_IO_getdelim(lineptr = 0x7fffffffe8e8,N = 0x7fffffffe8f8,分隔符= 10,FP = 0x7ffff7dd66a0)在iogetdelim.c:47 iogetdelim.c:没有这样的文件或目录。 \t在iogetdelim.c – Mark 2012-03-06 10:46:29

回答

4
int catchar(char a, char b) { 

    char a1[2]; 
    a1[1] = a; 
    a1[0] = b; 

    return atoi(a1); 
} 

atoi()需要一个字符串,字符串必须有一个'\0'终止,没有它 - atoi()只会继续找,直到它找到'\0',你可能会得到垃圾或段错误 - 如果你是出你分配的内存。

您应该声明你的尺寸3的阵列,并把'\0'在索引2

+0

你知道为什么gdb的抱怨:_IO_getdelim(lineptr = 0x7fffffffe8e8,N = 0x7fffffffe8f8,分隔符= 10,FP = 0x7ffff7dd66a0)在iogetdelim.c:47 iogetdelim.c:没有这样的文件或目录。 \t in iogetdelim.c – Mark 2012-03-06 10:50:14

+0

getline函数(第47行)需要读取一个文件,但是在给它一个参数“number”的时候,你的数组应该声明为char number [20],例如,不是“char *数”; – 2012-03-06 10:57:42

+0

@NicolasC:我仍然从GDB收到同样的错误。也许我的编译器/调试器有问题吗? – Mark 2012-03-06 11:00:29

0

字符串需要零(0)终止,因此你需要的3([A] [B] [\ 0阵列])。

int catchar(char a, char b) 
{ 
    char concat[3] = { a,b,NULL}; 

    return atoi(concat); 
} 
+0

声明一个2个元素的数组,并将三个元素推入它,导致立即堆栈溢出? – SecurityMatt 2012-03-06 11:30:13

+0

是的,我的不好,固定(它实际上编译过程中会导致错误)。 – AoeAoe 2012-03-06 11:32:02