초기화되지 않은 2중 배열을 서브루틴의 인자로 넘기고 싶습니다
초기화되지 않은 2중 배열을 서브루틴의 인자로 넘겨 서브루틴이
배열을 초기화하게 하려고 만들었습니다.
제가 아는 포인터 상식으로는 이렇게 넘기면 주소가 넘어가는게 맞는데
자꾸 포인터 타입이 맞지 않는다고 하고 실행해보면 segment fault가 납니다
어떻게 수정을 해야하나요?
#include <stdio.h>
#include <string.h>
char startIp[] = "123.456.789.100";
int ipToken(char *inputIp, char **tokenIp);
int main() {
char token[4][4];
int ret;
printf("%u\n", token);
printf("%u\n", token[1]);
printf("%u\n", token[2]);
printf("%u\n\n", token[3]);
ret = ipToken(startIp, token);
if(ret <= 0) {
printf("error occur\n");
exit(0);
}
printf("1th : %s\n", token[0]);
printf("2th : %s\n", token[1]);
printf("3th : %s\n", token[2]);
printf("4th : %s\n", token[3]);
return 0;
}
int ipToken(char *inputIp, char **output) {
char temp[64];
strncpy(temp, inputIp, strlen(inputIp) + 1);
const char delimeter[] = ".";
sprintf(output[0], "%s", strtok(temp, delimeter));
sprintf(output[1], "%s", strtok(NULL, delimeter));
sprintf(output[2], "%s", strtok(NULL, delimeter));
sprintf(output[3], "%s", strtok(NULL, delimeter));
return 1;
}
int ipToken(char *inputIp, char **tokenI
int ipToken(char *inputIp, char **tokenIp);
=>
int ipToken(char *inputIp, char tokenIp[][4]);
from saibi
ret = ipToken(startIp, (char **)token);
ret = ipToken(startIp, (char **)token);
요렇게 바꾸시고
sprintf((char *)output + 0, "%s", strtok(temp, delimeter));
sprintf((char *)output + 4, "%s", strtok(NULL, delimeter));
sprintf((char *)output + 8, "%s", strtok(NULL, delimeter));
sprintf((char *)output + 12, "%s", strtok(NULL, delimeter));
또는
sprintf((char *)(output + 0), "%s", strtok(temp, delimeter));
sprintf((char *)(output + 1), "%s", strtok(NULL, delimeter));
sprintf((char *)(output + 2), "%s", strtok(NULL, delimeter));
sprintf((char *)(output + 3), "%s", strtok(NULL, delimeter));
으로 해도 되는군요. 8)
p.s 흠, (output + 1) 방식으로 할 경우 buffer 크기가 4가 아니면 문제가 생기는군요. =3==3===3
더 이상 없다.
댓글 달기