Моя программа не находит символ EOF

У меня есть эта программа, которая удаляет из файла .txt все слова, которые начинаются и заканчиваются одним и тем же символом. На мой взгляд, это должно работать, но почему-то оно не останавливается, когда достигается EOF, и я печатаю какие-то странные китайские символы...

Вот код:

#include <stdio.h>
#include <stdlib.h>
#define MAX 255

void search(char *symbolMass, FILE *duomFail, FILE *rezFail)
{
    int i = 0, k =0, j =0, p = 0;
    char symbol = 0;
    char *rezMass;
    char word[20];

    rezMass = (char*)malloc(sizeof(char)*MAX);

    while(simbolis != EOF)
    {
        printf("veikia");
        symbol = symbolMass[i];

        if (symbol != 32 && symbol != 10 && symbol != EOF)
        {
            word[j] = symbol;
            i++;
            j++;
        }

        else
        {
            word[j] = symbol;
            i++;
            if(word [0] == word[j - 1])
            {
                rezMass[k] = word[j];
                k++;
            }
            else
            {
               for (p = 0; p <= j; p++, k++)
               {
                   rezMass[k] = word[p];
               }
            }
            j = 0;
        }
    }
    for(i = 0; i <= k; i++)
        symbolMass[i] = rezMass[i];
}

int main(int argc, char* argv[])
{
    FILE *duom, *rez;
    char *symbols;


    symbols = (char*)malloc(sizeof(char)*MAX);
    if (argc > 1)
    {
        duom = fopen (argv[1],"r");
        rez =fopen (argv[2],"w");
        if (duom != NULL)
        {
            while (symbols != NULL)
            {
                fgets(symbols, MAX, duom);
                search(symbols, duom, rez);
                fputs(symbols, rez);
            }
            fclose(duom);
        }
        else
        {
            printf("There is no file with name \"%s\"\n",argv[1]);
        }
    }
    else
    {
        printf("The command has no arguments.\n");
    }

    fclose(rez);
    free(simboliai);

    return 0;
}

Это работает следующим образом: он сканирует символы и помещает их в «слово», пока не достигнет «пробела», «новой строки» или «EOF», затем проверяет, начинается ли слово и заканчивается ли он одним и тем же символом, и если да, он печатает только «пробел», «новая строка» или «EOF», если нет, то печатается все слово. Да, и код написан на C (с использованием CodeBlocks, если это имеет значение).


c eof
person Tripper    schedule 24.11.2015    source источник
comment
Что такое simbolis? если сравнить symbol с EOF, symbol должно быть int, а не char.   -  person mch    schedule 24.11.2015
comment
Это должен был быть символ, который забыл изменить. А почему он должен быть int? Я проверяю коды ASCII.   -  person Tripper    schedule 24.11.2015
comment
EOF — это в значительной степени вымышленная вещь.   -  person Jonathon Reinhart    schedule 24.11.2015
comment
EOF не является значением ascii, это целое число -1, которое не может храниться в char.   -  person mch    schedule 24.11.2015
comment
Когда вы создаете минимальный, полный и проверяемый пример, убедитесь, что он действительно собирается (если у вас нет вопрос про ошибки сборки конечно). Не просто вписывайте это в вопрос и надейтесь, что все получится правильно, потому что тогда вы столкнетесь с несвязанными проблемами, такими как все ваши разные варианты написания переменной symbols. Все эти не связанные между собой проблемы отвлекают от реальной проблемы.   -  person Some programmer dude    schedule 24.11.2015


Ответы (1)


Это потому, что в буфере, который вы передаете функции search, нет символа EOF. Буфер symbolMass представляет собой строку и, как и все строки в C, заканчивается специальным нулевым символом '\0' (который, кстати, совпадает с 0).

Я предлагаю вам изменить свой цикл на что-то вроде этого

char symbol;

for (int i = 0; (symbol = symbolMass[i]) != '\0'; ++i)
{
    ...
}

Кроме того, не используйте «магические числа» для символов, вместо этого используйте фактические литералы символов, поэтому вместо

if (symbol != 32 && symbol != 10 && symbol != EOF)

do

if (symbol != ' ' && symbol != '\n')
person Some programmer dude    schedule 24.11.2015
comment
Итак, вместо while(symbol != EOF) я должен делать while(symbol != '\0') ? - person Tripper; 24.11.2015
comment
Существует также проблема с циклом в main, который не проверяет возвращаемое значение из fgets... - person Klas Lindbäck; 24.11.2015
comment
Хорошо, теперь я понял. Я пойду попытаюсь исправить проблемы, которые вы оба упомянули. Спасибо! :) - person Tripper; 24.11.2015