提示:文章
文章目录
前言
查了下,atoi可以转换负数。
修改成下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool isTargetSonNet(int array[], int len)
{
int tempArray[32] = {0};
int tempArrayIndex = 0;
for(int i = 0; i < len; i++)
{
int data = array[i];
if(data > 255 || data < 0)
{
return false;
}
int index = ((tempArrayIndex + 1) * 8);
while(data)
{
int dat = data % 2;
tempArray[--index] = dat;
data /= 2;
}
tempArrayIndex++;
}
int count = 0;
for(int i = 0; i + 1 < 32; i++)
{
int temp = tempArray[i] - tempArray[i + 1];
if(temp != 0 && temp != 1)
{
return false;
}
if(temp == 1)
{
count++;
}
}
if(count != 1)
{
return false;
}
return true;
}
int main() {
int a, b;
char sonNet[20] = {'\0'};
char ip1[20] = {'\0'};
char ip2[20] = {'\0'};
int arraySonNet[4] = {0};
int arrayIp1[4] = {0};
int arrayIp2[4] = {0};
while (scanf("%s", sonNet) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
char output = 'f';
char delimiters[2] = ".";
char* p = strtok(sonNet, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
// if(data > 255)
// {
// output = '1';
// break;
// }
// else if(data != 255 && data != 0)
// {
// output = '1';
// break;
// }
arraySonNet[index++] = data;
p = strtok(NULL, delimiters);
}
if(!isTargetSonNet(arraySonNet, 4))
{
output = '1';
}
if(output != 'f')
{
printf("%c\n", output);
break;
}
if(scanf("%s", ip1) != EOF)
{
p = strtok(ip1, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
if(data > 255 || data < 0)
{
output = '1';
break;
}
arrayIp1[index++] = data;
p = strtok(NULL, delimiters);
}
}
if(output != 'f')
{
printf("%c\n", output);
break;
}
if(scanf("%s", ip2) != EOF)
{
p = strtok(ip2, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
if(data > 255 || data < 0)
{
output = '1';
break;
}
arrayIp2[index++] = data;
p = strtok(NULL, delimiters);
}
}
if(output != 'f')
{
printf("%c\n", output);
break;
}
int count = 0;
for(int i = 0; i < 4; i++)
{
if( (ip1[i] & sonNet[i]) == (ip2[i] & sonNet[i]) )
{
++count;
}
}
if(output == 'f')
{
if(count == 4)
{
output = '0';
}
else {
output = '2';
}
}
printf("%c\n", output);
}
return 0;
}
验证一下demo示例
示例有错误
255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59
255.255.255.0
192.168.0.254
192.168.0.1输出 1
修改成下面的代码也不行
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool isTargetSonNet(int array[], int len)
{
int tempArray[32] = {0};
int tempArrayIndex = 0;
for(int i = 0; i < len; i++)
{
int data = array[i];
if(data > 255 || data < 0)
{
return false;
}
int index = ((tempArrayIndex + 1) * 8);
while(data)
{
int dat = data % 2;
tempArray[--index] = dat;
data /= 2;
}
tempArrayIndex++;
}
int count = 0;
for(int i = 0; i + 1 < 32; i++)
{
int temp = tempArray[i] - tempArray[i + 1];
if(temp != 0 && temp != 1)
{
return false;
}
if(temp == 1)
{
count++;
}
}
if(count != 1)
{
return false;
}
return true;
}
int main() {
int a, b;
char sonNet[20] = {'\0'};
char ip1[20] = {'\0'};
char ip2[20] = {'\0'};
int arraySonNet[4] = {0};
int arrayIp1[4] = {0};
int arrayIp2[4] = {0};
while (scanf("%s", sonNet) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
char output = 'f';
char delimiters[2] = ".";
char* p = strtok(sonNet, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
// if(data > 255)
// {
// output = '1';
// break;
// }
// else if(data != 255 && data != 0)
// {
// output = '1';
// break;
// }
arraySonNet[index++] = data;
p = strtok(NULL, delimiters);
}
if(!isTargetSonNet(arraySonNet, 4))
{
output = '1';
}
if(output != 'f')
{
printf("%c\n", output);
break;
}
if(scanf("%s", ip1) != EOF)
{
p = strtok(ip1, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
if(data > 255 || data < 0)
{
output = '1';
break;
}
arrayIp1[index++] = data;
p = strtok(NULL, delimiters);
}
}
if(output != 'f')
{
printf("%c\n", output);
continue;
}
if(scanf("%s", ip2) != EOF)
{
p = strtok(ip2, delimiters);
int index = 0;
while(p != NULL)
{
//printf("%s\n", p);
int data = atoi(p);
if(data > 255 || data < 0)
{
output = '1';
break;
}
arrayIp2[index++] = data;
p = strtok(NULL, delimiters);
}
}
if(output != 'f')
{
printf("%c\n", output);
continue;
}
int count = 0;
for(int i = 0; i < 4; i++)
{
if( (ip1[i] & sonNet[i]) == (ip2[i] & sonNet[i]) )
{
++count;
}
}
if(output == 'f')
{
if(count == 4)
{
output = '0';
}
else {
output = '2';
}
}
printf("%c\n", output);
}
return 0;
}
示例有错误
255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59
255.255.255.0
192.168.0.254
192.168.0.1输出
1
1
2
0
修改代码,修改成goto,但是还是不行,会打印4个输出,很奇怪,我就调试。调试后我意识到goto会跳过其他scanf操作。
应该先把数据采集完在处理。