0

正確に言うと、ファイル A からファイル B にコピーしようとしています。文字 'e' と 't' の両方を含まない単語 (the、peter など) はすべて、プログラムは正常に動作しますが、アウトファイルの終わり 変なサインが出てきました。

Input: What says Lucentio to this shame of ours?
Output: What says  to this shame of ours?˙

(キャラクターが見えます˙か?)

私はそれを望んでいません、私はそれが何であるかわかりませんが、EOFではありません。コピーから除外しようとしましたが、機能しません。ここで助けが必要です。

コード:

char signHold[1];

int main(int *argc, char** argv)
{
    FILE* infile;
    FILE* outfile;

    char* string = NULL;
    if(argc != 3)
    {
        printf(stderr,"Error: Improper number of arguments");
        return EXIT_FAILURE;
    }
    remove(argv[2]);
    infile = fopen(argv[1],"r");
    while(feof(infile) == 0)
    {
        string = getWord(infile);
        if(checkDenied(string))
        addToFile(outfile, argv[2], string);

        addToFile(outfile, argv[2], signHold);
    }
    fclose(infile);
    free(string);
    return EXIT_SUCCESS;
}

char* getWord(FILE* ptr)
{
    char* tempString;
    size_t memSize = 0;
    int c;

    tempString = expandRealloc(NULL,sizeof(char));
    while(c = fgetc(ptr))
    {
        if(isalpha(c) != 0)
        {
            tempString = expandRealloc(tempString, (memSize+1)*sizeof(char)+1);
            tempString[memSize] = c;
            memSize++;
        }
        else
        {
            signHold[0] = c;
            break;
        }
    }
    tempString[memSize] = '\0';
    return tempString;
}

short int checkDenied(const char* str)
{
    int i;

    i = strspn("e", str);

    if(i >= 1)
    {
        i = strspn("t", str);
        if(i >= 1)
        {
            return EXIT_SUCCESS;
        }
    }
    return EXIT_FAILURE;
}

short int addToFile(FILE* ptr, char* directory, char* text)
{
    ptr = fopen(directory,"a+");
    fprintf(ptr,"%s", text);
    fclose(ptr);
    return EXIT_SUCCESS;
}
4

3 に答える 3

0

signHold[1]に保存されているジャンクメモリだと思います。1文字のみを許可し、NULで終了しないでください。これは、疑問符を書き出すと、最初の'\0'の前にある後のメモリも書き出すことを意味します。

于 2012-06-24T18:54:05.290 に答える
0

これはステートマシンです。可変サイズのバッファを使用させることは、読者の課題になります;-)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, char **argv)
{
    FILE *infile;
    FILE *outfile;

    char buff[100];
    size_t len,idx;
    int ch, state;

    if(argc != 3)
    {
        fprintf(stderr,"Error: Improper number of arguments");
        return EXIT_FAILURE;
    }
    infile = fopen(argv[1],"r");
    outfile = fopen(argv[2],"w");

    len = 0;
    for (state=0; state >= 0; ) {
        ch = fgetc(infile);
        if (isalpha(ch)) {
            if (ch == 'e') state |= 1;
            else if (ch == 't') state |= 2;
            if (state != 3) buff[len++] = ch;
            continue;
        }
    /* no character, this must be the end of a word. */
        if (state != 3) for(idx=0; idx < len; idx++ ) {
            fputc(buff[idx], outfile);
            }
        if (ch == EOF) {state = -1; continue;}
        fputc(ch, outfile);
        len = 0; state = 0;
        }
    fclose(infile);
    fclose(outfile);
    return EXIT_SUCCESS;
}
于 2012-06-24T17:11:47.520 に答える
0

fgetcまず、ファイルの終わりでリターンを想定しています0が、そうではありません。返しますEOF。おそらく、あなたは を読んでいてEOF、それを文字に割り当ててsignHold[0]EOFますchar

次に、文字列がNULで終了していないため (サイズが 1 で、最初の文字が ' ではない) signHold、ランダムな文字を含む文字を含む印刷に進みます。(ちなみに、これも未定義の動作です)。\0'signHold

于 2012-06-24T16:07:02.640 に答える