2012-03-06 10 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

+0

@Sjoerd:gdbが文句を言う:_IO_getdelim(lineptr = 0x7fffffffe8e8、n = 0x7fffffffe8f8、区切り文字= 10、fp = 0x7ffff7dd66a0):iogetdelim.c:47 iogetdelim.c:このようなファイルやディレクトリはありません。 iogetdelim.c – Mark

答えて

4
int catchar(char a, char b) { 

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

    return atoi(a1); 
} 

atoi()文字列を期待して、文字列は、それなしで、'\0'ターミネータを持っている必要があります - それは'\0'を見つけるまでatoi()はちょうど探し続けるだろう、とあなたはゴミやセグメンテーション違反を得るかもしれない - あなたが外の場合あなたの割り当てられたメモリ。

あなたはサイズ3のあなたの配列を宣言し、文字列(0)終了し、このようにあなたが3([A] [B] [\ 0の配列を必要とするnullにする必要があります。2.

+0

で \t GDBが文句を言う理由を知っています:iogetdelim.cで_IO_getdelimを(lineptr = 0x7fffffffe8e8、N = 0x7fffffffe8f8、区切り文字= 10、FP = 0x7ffff7dd66a0):47 iogetdelim.c:そのようなファイルやディレクトリはありませんが。 \t in iogetdelim.c – Mark

+0

getline関数(行47)は、ファイルを読み込むことを期待していますが、パラメータ "number"を与える方法では、配列はchar * [20]数"; –

+0

@NicolasC:私はまだGDBから同じエラーを受けています。おそらく私のコンパイラ/デバッガに何か問題がありますか? – Mark

0

インデックスで'\0'を置く必要があります])。

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

    return atoi(concat); 
} 
+0

2つの要素の配列を宣言し、3つの要素を押し込んですぐにスタックオーバーフローを引き起こしますか? – SecurityMatt

+0

はい、私の悪い、固定(実際にコンパイル中にエラーが発生します)。 – AoeAoe

関連する問題