2016-10-18 2 views
-8

이 코드는 결과를 파일에 저장합니다. 마찬가지로, 라인 차단기 또는 sth 감지에 대한 일부 문제가 있습니다. 다음은 예입니다 :파일을 줄 바꿈하는 문제가 발생했습니다.

출처 :

This is a line. 
This is another line. 
Quick brown fox jumps over a lazy dog! 

결과 :

(blank line) 
.enil a si sihT 
.enil rehtona si sihT!god yzal a revo spmuj xof nworb kciuQ 
#include <stdio.h> 
#include <string.h> 
char *reverse (char *str) 
{ 
    char *begin, *end, c; 
    if (!str || !(*str)) 
     return NULL; 
    for (begin=str, end=str+strlen(str)-1; begin<end; begin++, end--) 
    { 
     c=*begin; 
     *begin=*end; 
     *end=c; 
    } 
    begin=str+strlen(str)+1; *begin='\0'; //?? 
    return str; 
} 
void main(void) 
{ 
    char line[1000]; 
    FILE *fsrc, *frslt; 
    fsrc=fopen("source.txt", "r"); 
    if (fsrc==NULL) return; 
    frslt=fopen("result.txt", "w"); 
    while (!feof(fsrc)) 
    { 
     fgets (line, 1000, fsrc); 
     fputs (reverse(line), frslt); 
    } 
    fclose(fsrc); 
    fclose(frslt); 
} 
+3

- http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong ([while 루프에서 무엇이 일어 났는지를 결정하기 위해 feof 잘못 숙지]) –

+3

코드는 정상적으로 작동하지만 선이 너무 바뀌고 있습니다. 새로운 줄 바꿈 ('\ n')이 역순으로 일어나므로 줄 바꿈이 각 줄의 시작 부분에 있지만 "빠른 갈색 여우 ..."에는 줄이 없습니다. 결국 피드, 그래서 라인 2와 3 함께 smooshed입니다. '\ n'을 사용하여 줄 바꿈을 시도하고 있습니다. –

+0

내부에서 작업하고 있으므로 필요하지 않습니다.'begin = str + strlen (str) +1; * begin = '\ 0';'그리고 너무 많이 추가하고있다. (버퍼가 크지 만 여전히 문제는 없다.) –

답변

3

또는 문제 :

가 해결되지 않을 수도 있습니다 의견/nitpicks의 커플
if (!str || !(*str)) 
    return NULL; 

그렇게하지 마십시오. 빈 문자열에는 NULL을 반환하지 않고 fputs()는 barf를 반환합니다. 내 경험상, a) str 포인터가 null이 아니라고 주장하고, b) 빈 문자열을 리턴한다.

begin=str+strlen(str)+1; *begin='\0'; //?? 

이미 종료되었으므로 문자열을 종료 할 필요가 없습니다.

void main(void) 

아니요, main()은 int를 반환합니다.

while (!feof(fsrc)) 

이것은 작동하지 않습니다. feof()/ferror()를 테스트하기 전에 IO를 수행해야합니다. 이휴 그냥 fgets() 루프에 더 낫다.

while (fgets(line, sizeof line, fsrc) { 
    ... 
} 

은 입력 및 출력 파일을 삭제하는 것이 좋습니다 수 있으며, 단순히 표준 입력에서 읽고 적어도 테스트 동안, 표준 출력에 기록. 구현하려는 기능은 이미 UNIX 셸 (man rev)에서 사용할 수 있습니다. stdin/stdout을 사용하면 테스트 결과를 테스트 결과와 비교하는 것이 더 쉬워집니다.

또한 fgets()는 문자열에서 \ n을 제거하지 않습니다. "foo \ n"과 같은 입력은 "\ noof"가됩니다. 이것은 아마도 당신이 원하는 것이 아닙니다.

다음은 코드에서 내 의견을 보여주는 스 니펫입니다. 그것은 모든 문제를 해결하지는 못하지만, 당신을 풀만큼 충분해야합니다.

#include <stdio.h> 
#include <string.h> 
#include <assert.h> 

void reverse(char *str) 
{ 
    char *begin, *end, c; 
    size_t n; 

    assert(str != NULL); 

    n = strlen(str); 
    if (n == 0) 
     return; 

    for (begin = str, end = str + n - 1; begin < end; begin++, end--) { 
     c = *begin; 
     *begin = *end; 
     *end = c; 
    } 
} 

int main(void) 
{ 
    char line[1000]; 

    while (fgets(line, sizeof line, stdin)) { 
     reverse(line); 
     fputs(line, stdout); 
    } 
} 

HTH

관련 문제