下面的代码将新域名和IP地址添加到表中,或修改旧整数的值。
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
struct DNS {
char server_name[50];
char ip[20];
};
struct DNS table[20];
int validate_ip(char* ip){
int valid_ip = 1;
int already_exists = 0;
struct sockaddr_in address;
if (inet_pton (AF_INET, ip, &address.sin_addr) == 0) {
printf ("Invalid IP address. Please re-enter the correct IP address.\n");
valid_ip = 0;
}
for (int i = 0; i < 20; i++) {
if(strcmp (ip, table[i].ip) == 0){
printf ("IP address already exists.\n");
already_exists = 1;
break;
}
}
return (valid_ip && !already_exists);
}
void printDnsTable(int count){
printf("\n\n\t\tSERVER NAME\t IP ADDRESS\n");
for(int i = 0; i < count; i++) {
printf("\t\t%-19s%-s\n", table[i].server_name, table[i].ip);
}
}
int main(int argc, char **argv){
int count = 0;
char choice;
char domain_name[50];
char ip_address[50];
int i;
do {
printf("count:%d\n",count);
if(count == 0) {
printf("DNS cache empty.\n");
printf("Do you want to add/modify the DNS table(y/n)?");
scanf("%s", &choice);
if(choice == 'n') {
break;
}
}
printf("Domain name: ");
scanf("%s",domain_name);
for(i=0; i<20; i++) {
if(strcmp(domain_name,table[i].server_name) == 0 ){
break;
}
}
ip: strcpy(ip_address, " ");
printf("IP address: ");
scanf("%s", ip_address);
if(validate_ip(ip_address) == 0){
goto ip;
}
if(i == 20){
strcpy(table[count].server_name,domain_name);
strcpy(table[count].ip,ip_address);
} else {
strcpy(table[i].ip,ip_address);
}
**count+=1;**
printDnsTable(count);
choice = ' ';
printf("\nDo you want to add/modify the DNS table?(y/n)");
scanf("%s", &choice);
} while(choice == 'y');
}
do-while循环中的count变量即使每次递增也会在每次迭代中将其值保持为0.这是我在gcc 9.3中为上述代码获得的输出
数:0
DNS缓存为空。
是否要添加/修改DNS表(y / n)?y
域名:yahoo.com
IP地址:10.2.45.67
SERVER NAME IP ADDRESS yahoo.com 10.2.45.67
是否要添加/修改DNS表?(y / n)y
数:0
DNS缓存为空。
是否要添加/修改DNS表(y / n)?n
当我使用使用gcc 5.4.1的在线编译器时,相同的代码为我提供了正确的输出。 为什么会有差异?我在哪里弄错了?我无法降级我的gcc版本,那么如何使该代码与gcc 9.3一起使用?