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