/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串一维数组
* @return int* returnSize 返回数组行数
*/
#include <stdlib.h>
#include <string.h>
#define isValid(a) (a >= 0 && a <= 255)
// bool isValid(int a) {
// if(a >= 0 && a <= 255) return true;
// return false;
// }
char** restoreIpAddresses(char* s, int* returnSize ) {
// write code here
int len = strlen(s);
if(len < 4) return NULL;
int dotP1, dotP2, dotP3;
int i1 = 0,i2 = 0,i3 = 0,i4 = 0;
*returnSize = 0;
char** result = (char**)malloc(sizeof(char*));
for(dotP1 = 1; dotP1 < 4; dotP1++) {
char temp1[4];
strncpy(temp1, s, dotP1);
temp1[dotP1] = '\0';
// printf("strncpy(temp, s, dotP1);的结果是%s\n", temp1);
i1 = atoi(temp1);
if(!isValid(i1)) continue;
if(dotP1 > 1 && temp1[0] == '0' && temp1[1]) continue;
for(dotP2 = dotP1 + 1; dotP2 < dotP1 + 4; dotP2++) {
char temp2[4];
strncpy(temp2, s + dotP1, dotP2 - dotP1);
temp2[dotP2 - dotP1] = '\0';
i2 = atoi(temp2);
if(!isValid(i2)) continue;
if(dotP2 - dotP1 > 1 && temp2[0] == '0' && temp2[1]) continue;
for(dotP3 = dotP2 + 1; dotP3 < dotP2 + 4; dotP3++) {
if(len - dotP3 <= 0 || len - dotP3 > 3) continue;
char temp3[4];
strncpy(temp3, s + dotP2, dotP3 - dotP2);
temp3[dotP3 - dotP2] = '\0';
i3 = atoi(temp3);
if(!isValid(i3)) continue;
if(dotP3 - dotP2 > 1 && temp3[0] == '0' && temp3[1]) continue;
char temp4[4];
strncpy(temp4, s + dotP3, len - dotP3);
temp4[len - dotP3] = '\0';
i4 = atoi(temp4);
if(!isValid(i4)) continue;
if(len - dotP3 > 1 && temp4[0] == '0' && temp4[1]) continue;
// printf("%d.%d.%d.%d\n",i1,i2,i3,i4);
result[(*returnSize)] = (char*)malloc(sizeof(char) * (len + 3));
if(result[(*returnSize)] == NULL) {
for(int i = 0; i < *returnSize; i++) {
free(result[i]);
}
free(result);
return NULL;
}
sprintf(result[(*returnSize)], "%s.%s.%s.%s", temp1, temp2, temp3, temp4);
(*returnSize)++;
char** new_result = (char**)realloc(result, sizeof(char*) * ((*returnSize) + 1));
if(new_result == NULL) {
for(int i = 0; i < *returnSize; i++) {
free(result[i]);
}
free(result);
return NULL;
}
result = new_result;
}
}
}
return result;
}