我的程序没有找到EOF符号

时间:2015-11-24 12:11:03

标签: c 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)。

1 个答案:

答案 0 :(得分:3)

那是因为传递给EOF函数的缓冲区中 没有search个字符。缓冲区symbolMass是一个字符串,就像C中的所有字符串一样,它由特殊的空字符'\0'终止(顺便提一下,它与{{1}相同})。

我建议你将循环改为这样的

0

另外,不要对字符使用“幻数”,而是使用实际的字符文字,而不是

char symbol;

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

DO

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