2016-10-18 7 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

[whileループ内FEOFが間違っている - これを読む](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong ) –

+3

コードは正常に動作していますが、行が逆転しています。起こっているのは、改行( '\ n')も反転しているため、改行が各行の先頭に置かれていますが、「クイックブラウンキツネ...」には行がありません最後にはフィードが必要なので、2行目と3行目を一緒にスムージングするのはこのためです。 '\ 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) 

NAH、main()はintを返します。

while (!feof(fsrc)) 

これは機能しません。 feof()/ ferror()をテストする前にIOを行う必要があります。ただ単にfgets()にループするほうが良いです。

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

入力および出力ファイルをドロップすることをお勧めすることができ、単に標準入力から読み込まれ、少なくともテストしながら、stdoutに書き込みます。実装しようとしている機能は、すでにUNIXシェル(man rev)で利用可能です。 stdin/stdoutを使用すると、結果をテストして結果とRevの結果との比較が容易になります。

また、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

関連する問題