复制字符串时出现分段错误

时间:2012-01-07 11:33:22

标签: c unix

我正在尝试执行以下代码,但是对于每次尝试我都会遇到分段错误。这个问题似乎来自于令牌化中使用的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]);
} 

2 个答案:

答案 0 :(得分:6)

char* ipStr[9];

上面创建了一个包含9个字符串的数组(指向char的指针)。但是,它不会为九个字符串分配内存。

当您strncpy进入ipStr时,您的程序会出现段错误。

解决方案:分配内存(例如使用malloc()strdup())。

答案 1 :(得分:1)

如果地址有效,您的validchk()函数将无法返回TRUE。这将使其行为或多或少随机。

您应该重写它,保持相同的核心验证规则,如下:

int validchk(const char *string)
{
  return (string != NULL) && (strlen(string) == 32);
}