2

このコードを使用すると、出力で 1 行おきに空になるという問題があります。望ましい出力は次のとおりです。http://paste.ubuntu.com/1354365/

取得中: http://paste.ubuntu.com/1356669/

これらの空の行が1行おきに表示される理由を誰かが知っていますか?

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

FILE *fp; 
FILE *fw; 


int main(int argc, char *argv[]){
char buffer[100];
char *fileName = malloc(10*sizeof(char));
char **output = calloc(10, sizeof(char*));
char **outputBuffer = calloc(10, sizeof(char*));

fw = fopen("calvin.txt", "w+");

for(int y = 0; y < 6; y++){
    for(int i = 0; i < 10; i ++)
    {
        output[i] = malloc(100);
    }

    for(int x = 0; x < 12; x++){
        sprintf(fileName,"part_%02d-%02d", x, y);
        fp = fopen(fileName, "rb");

        if(fp == NULL)
        {
            printf("Kan ikke åpne den filen(finnes ikke/rettigheter)\n");
        }
        else if(fp != NULL){

            memset(buffer, 0, 100); 
            for(int i = 0; i < 10; i++){ 
                outputBuffer[i] = malloc(100);
            }


            fread(buffer, 1, 100, fp); 


            for(int i = 0; i < 100; i++){
                if(buffer[i] == '\0')
                {
                    buffer[i] = ' ';
                }
                else if(buffer[i] == '\n')
                {
                    buffer[i] = ' ';
                }
            }
            for(int i = 0; i < 10; i++) { 
                strncpy(outputBuffer[i], buffer + i * 10, 10);

                strncat(output[i], outputBuffer[i]+1, 11);


            }                       
        }

    }

    for(int i = 0; i < 10; i++){
        printf("%s\n", output[i]);

    }

}
fclose(fp);
free(fileName);

}
4

2 に答える 2

0

この部分は問題があるようです:

           strncpy(outputBuffer[i], buffer + i * 10, 10);

           strncat(output[i], outputBuffer[i]+1, 11);

outputBuffer1) 追加のステップを使用する必要があるのはなぜですか?

2)strncpy()コピーする文字列が null で終了することが保証されていないことはわかっています。

3) さらに重要なことは、output[i]初期化されていないため、strncat()ジャンクが既にそこにある場合は文字列を連結します。 each を作成するときの代わりに使用すると、役立つ場合があります。calloc()malloc()output[i]output[i]変数が余分な改行を保持している 可能性さえあります。

4)空の文字列に初期化されたとしても、output[i]12回ループして最大11文字を書き込むため、簡単にオーバーフローする可能性があります。ヌル ターミネータの 11 * 12 + 1 = 100 バイト配列に書き込まれる 133 バイト。

一般に、これが の使用を必要とするクラス割り当てでない限りmalloc()、プログラムの開始時に変数を 1 回だけ宣言し、各ループの開始時に変数をゼロに設定しない理由がわかりません。

char fileName[10];
char output[10][100];
char outputBuffer[10][100];

そして、他の人が述べたように、大量のメモリを割り当て、それを解放しようとしません。ループの外で一度割り当てるか、割り当て手順をスキップして直接宣言します。

于 2012-11-14T00:52:10.447 に答える
0

ファイルから修正を読み取っていません。最初の最初の画像には、次のものがあります。

      o ""oo    " o o o

二番目に

      ""oo     o o o

これは最初の行なのであまり意味がありません。最初の行について話しているので、空行とは関係ありません。

左から文字を読んでいるように見える-2ので、「 」などに「他のものに印刷」します。

これを試してみてください。最も効率的な解決策ではないかもしれません:

int read(char *file)
{
     FILE *fp = NULL;         
     int size = 0, pos = 0,i;
     fp = fopen(file,"r");
     if (!fp) return 0;

     for(; ((getc(fp))!=EOF);  size++); // Count the number of elements in the file

     fclose(fp);


     char buffer[size];

     fp = fopen(file,"r");

     if (!fp) return 0;

     while((buffer[pos++]=getc(fp))!=EOF); // Saving the chars into the buffer

     for(i = 0; i < pos; i++)              // print them.
       printf("%c",buffer[i]);

    fclose(fp);
    return 1;  
}
于 2012-11-13T22:50:36.973 に答える