Пропуск www in файловых хостов - PullRequest
0 голосов
/ 19 января 2020

Итак, у меня небольшая программа. У меня возник вопрос относительно небольшого фрагмента в моей программе.

#include <stdio.h>

int main()
{
    FILE *host_file = fopen("/etc/hosts","r");
    if(host_file == NULL){
        printf("Can't open host file.");
    }

    char str[10000];
    char pattern[256];
    unsigned int i;
    while(fgets(str, 10000, host_file) != NULL) {
        i = 0;
        char *c = str;
        while(*c != EOF && *c != '\n') {
            if( *c != ' ' && *c != '\t'){
                pattern[i++] = *c;
            }else{
                pattern[i] = '\0';
                printf("%s ", pattern);
                i = 0;       
            }
        *c++;
       }
       printf("\n");
    }
    return 0;
}

host_file Это файл /etc/hosts из Linux. Не имеет значения, что делает моя программа. Не имеет значения, как работает этот фрагмент кода.

if( *c != ' ' && *c != '\t'){
    pattern[i++] = *c;
}else{
    pattern[i] = '\0';
    printf("%s ", pattern);
    i = 0;       
}

Логически шаблон должен выводить каждое слово в строке, но программа выдает странный результат: enter image description here

Файл hosts:

127.0.0.1   localhost
127.0.1.1   NameOfMyPc
127.0.0.1   phpmyadmin.loc www.phpmyadmin.loc

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

1.1.1.. test.loc www.test.loc

Пожалуйста, объясните, почему это происходит? Очень интересно ...

1 Ответ

2 голосов
/ 19 января 2020

Этот код:

if( *c != ' ' && *c != '\t'){
    pattern[i++] = *c;
}

заставляет программу накапливать символы, отличные от пробелов или символов табуляции. Затем этот код:

else{
    pattern[i] = '\0';
    printf("%s ", pattern);
    i = 0;       
}

заставляет программу печатать накопленный текст, но только когда виден пробел или табуляция. Ничто не заставляет программу печатать накопленный текст, когда виден конец строки. Таким образом, последнее «слово» (текст без пробела или табуляции) строки никогда не печатается. Программа печатает свой ввод с последним словом, удаленным из каждой строки.

Лог c кода необходимо изменить. Простое «исправление» заключается в печати накопленного текста, когда виден конец строки. Однако это приводит к тому, что программа просто копирует свои входные данные в свои выходные данные, а затем обработка для распознавания пробелов или табуляций кажется бессмысленной, так почему она вообще существует? Если вы собираетесь продолжить разработку программы, удалите «www.» из имен в файле hosts вам нужно четко указать это в вопросе, чтобы можно было дать совет о хорошем исправлении.

Дополнительно:

*c != EOF неверно. EOF является значением int и должно сравниваться с int, возвращаемым различными подпрограммами, такими как getchar. Сравнивать его с char, что *c, неверно.

*c++; должно быть просто c++;, поскольку его единственный эффект - увеличение c. Разыменование для получения значения char не имеет смысла, поскольку с ним ничего не делается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...