2012-06-24 2 views
0

, если быть точным, я пытаюсь скопировать из файла A в файл B каждое слово, в котором нет двух букв «e» и «t» в них , peter и т. д.), программа работает нормально, но в конце outfile я получаю странный знак.Удаление букв из слов в файле C - проблематичный знак

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

(Может у увидеть характер ˙?)

Я не хочу, я понятия не имею, Что это, но его не EOF, я пытался declude его от копирования и он не работает. Мне нужна помощь здесь.

Код:

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; 
} 
+0

Почему? Это будет сильно связано с I/O, поэтому использование C не приведет к чему-то другому, скажем, AWK, в котором это тривиально. –

+2

Я студент-информатик, и я пытаюсь научиться C .. Что такое AWK? ~. –

+0

Было ли это задано как домашнее задание или просто ваша собственная идея что-то делать? Если это домашнее задание, оно должно быть помечено как таковое. В противном случае я бы посоветовал выбрать что-то еще, что по крайней мере разумно подходит для вещей, которые C делает хорошо. –

ответ

0

Во-первыхи, вы предполагаете fgetc возвращаете 0 на конце файла, но это не так. Он возвращает EOF. Возможно, вы читаете EOF, присвоив его характер, то есть signHold[0] (что может привести ни к чему, так как EOF не вписывается в char)

Затем переходите к печати signHold, который содержит случайный характер с последующим кто знает, что, поскольку строка не имеет NUL-конца (ее размер равен 1, а его первый символ не равен \0'. То есть вы печатаете все, что может произойти после signHold. (Это также неопределенное поведение, кстати)

+0

Не мог бы указать мне строку, где я предполагаю fgetc возвращает 0?Также прекращение знака [0] не является проблемой, если я делаю: if (signHold [0] == '˙') и деблокировать его так, символ не появляется, что показывает, что char не является signHold [ 495964], но signHold [0]. –

+0

'while (c = fgetc (ptr))' – wildplasser

+0

Я не принимаю что-либо в этой строке, я просто беру символ, используя fgetc, и eof проверяется в основном с помощью функции feof()>.> –

0

Это statemachine. Применяя его с помощью буфера с переменным размером, le ft упражнение читателю ;-)

#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; 
} 
0

Я считаю, что это неактивная память, хранящаяся в signHold [1]. Вы разрешаете только 1 символ и не завершаете его NULL. Это означает, что когда вы выписываете вопросительный знак, он также записывает любую память после нее, которая находится перед первым «\ 0».