加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:15:07 所属栏目:安全 来源:网络整理
导读:我正在尝试执行下面的代码,但是对于每次尝试我都会出现分段错误.这个问题似乎来自于令牌化中使用的strncpy函数.我对编程有点新意.请帮我调试代码.请帮忙: /* ** Program to accept a binary IP address from the command line and ** if it is a valid IP a
我正在尝试执行下面的代码,但是对于每次尝试我都会出现分段错误.这个问题似乎来自于令牌化中使用的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 Addressn");
        exit(1);
    }

    classify(argv[1]);

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

    //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 classifyn");
        exit(1);
    }
    printf("%cn",('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] = '';
    //  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]);
}

解决方法

char* ipStr[9];

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

当您加入ipStr时,您的程序会出现段错误.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读