不同的gcc版本提供不同的输出

时间:2020-09-18 20:34:03

标签: c gcc

下面的代码将新域名和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一起使用?

0 个答案:

没有答案