2012-01-07 7 views
4

をコピーしている間、私は以下のコードを実行しようとしていますが、すべての試みのために私は、セグメンテーションフォールトをgetingています。問題は、トークン化に使用さはstrncpy関数から来ているようです。私はプログラミングに少し慣れています。コードをデバッグしてください。助けてください:セグメンテーションフォールト文字列

 /* 
     ** Program to accept a binary IP address from the command line and 
    ** if it is a valid IP address, show the user its dotted decimal form. 
    ** Also tell the user, which class of IP address it belongs to 
    */ 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 

    #define TRUE 1 
    #define FALSE 0 

    int validchk(char uarg[]); 
    int tokenize(char uarg[], char* uargv[]); 
    int toNum(char harr[], char iparr[]); 
    void shownum(char *iparr[]); 
    void classify(char uarg[]); 
    void usage(); 
    void mystrncpy(char* arr, char* brr); 

    int main(int argc, char *argv[]) 
    { 
    char* ipStr[9]; 

    if (argc != 2) { 
     usage(); 
     exit(1); 
    } 

    if (validchk(argv[1]) == FALSE) { 
     fprintf(stderr,"Error in the length of the IP Bit Address\n"); 
     exit(1); 
    } 

    classify(argv[1]); 

    if (tokenize(argv[1],ipStr) == -1) { 
     perror("Error in tokenizing the binary IP address\n"); 
    } 

    //shownum(ipStr); 

    return 0; 
} 
void usage() 
{ 
    fprintf(stderr,"Usage: bi2ip <32bitip>\n"); 
    return; 
} 

int validchk(char uarg[]) 
{ 
    if (strlen(uarg) != 32) { 
     return FALSE; 
    } 

} 
void classify(char uarg[]) 
{ 
    int ipcnt = 0; 
    char *p; 
    int doneflag = FALSE; 
    while(ipcnt <= 4) { 
     p = &uarg[ipcnt]; 
     if (*p == '0') { 
      doneflag = TRUE; 
      break; 
     } 
     ipcnt++; 
    } 
    if (doneflag == FALSE) { 
     fprintf(stderr,"Failed to classify\n"); 
     exit(1); 
    } 
    printf("%c\n",('A'+ipcnt)); 
    return; 
} 
int tokenize(char uarg[], char* uargv[]) 
{ 
    int i =0,j; 
// for (i = 0; i <4; i++) { 
    // strncpy(&uargv[i][0],&uarg[j],8); 
     //strncpy(uargv[1],&uarg[8],8); 
     //strncpy(uargv[2],&uarg[16],8); 
     //strncpy(uargv[3],&uarg[24],8); 
    // uargv[i][8] = '\0'; 
    // j+=8; 
     for (j = 0; j<8; j++) { 
      uargv[0][j] = uarg[j]; 
      uargv[1][j] = uarg[j+8]; 
      uargv[2][j] = uarg[j+16]; 
      uargv[3][j] = uarg[j+24]; 
     } 

// } 
    return 0;9 
} 
void shownum(char *iparr[]) 
{ 
    int i,j; 
    unsigned long arr[4]; 
    for(i = 0; i<4; i++) { 
     arr[i] = strtoul(iparr[i],NULL,2); 
    } 
    for (j = 0; j < 3; j++) { 
     printf("%lu.",arr[j]); 
    } 
    printf("%lu",arr[3]); 
} 
+1

; 9'行うことになって? –

答えて

6
char* ipStr[9]; 

上記は9つの文字列(charへのポインタ)の配列を作成します。それは、しかし、9つの文字列用のメモリを割り当てません。

strncpyipStrに設定すると、プログラムがエラーになります。

溶液:(例えばmalloc()又はstrdup()を使用して)メモリを割り当てます。

1

あなたvalidchk()機能は、アドレスが検証された場合にTRUEを返すことができません。これは多かれ少なかれランダムに振る舞います。

あなたのように、同じコア検証ルールを保ち、それを書き換える必要があります: `リターン0で何

int validchk(const char *string) 
{ 
    return (string != NULL) && (strlen(string) == 32); 
} 
関連する問題