0

標準入力からの行をマージし、80 文字を超える文のみを出力するプログラムを作成しようとしています。最初に見つかった行はうまく機能しますが、後の行は空です。行に何か問題があると思います current_sentence = malloc(sentence_len);

文字列を正しく再割り当てするにはどうすればよいですか?

コード

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define BUFFERSIZE 100

char* merge_string(char *text[], int n){
    int i;
    char *result = malloc(BUFFERSIZE * n);

    for (i=0; i < n; i++){
        strcat(result, text[i]);

    }
    return result;
}


int main(int argc, char *argv[]){
    char buffer[BUFFERSIZE];

    int i = 0;
    char *text[BUFFERSIZE];

    while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
        text[i] = strdup(buffer);
        i++;
        }
    char *sentence = merge_string(text, i);

    int sentence_len = strlen(sentence);
    int j = 0;
    int counter = 0;

    char *current_sentence = malloc(sentence_len);

    while (j < sentence_len){
        current_sentence[counter] = sentence[j];

        if (sentence[j] == '\n' && counter >= 80){
            printf(":::HIT:::%s\n\n\n", current_sentence);
            counter = 0;
            current_sentence = malloc(sentence_len);
            }
            else if (sentence[j] == '\n'){
                    puts("Resetting counter");
                    counter = 0;
            }
            j++; counter++;
    }
    return 0;
}

出力

make 1_17; ./1_17 < example.txt
make: `1_17' is up to date.
Resetting counter
Resetting counter
:::HIT:::SHenri Cartier-Bresson (1908-2004) said "Your first 10,000 photographs are your        worst," but he shot more than one an hour.) 



Resetting counter
:::HIT:::


Resetting counter
:::HIT:::
4

2 に答える 2

2

current_sentencenull 文字 ( ) で終了していません'\0'printf文字列を正しく出力したい場合は、null で終了していることを確認してください。

ちなみに一秒もいらないmalloc。割り当てられたメモリcurrent_sentenceを再割り当てせずに再利用します。

また、割り当てられたメモリを適切に解放していないことにも注意してください。freeそれぞれに一致する呼び出しを使用する必要がありますmalloc。おそらくこれは今は問題ではありませんが、メモリ リークが発生します。

ループは次のようになります。

while (j < sentence_len)
{
    current_sentence[counter] = sentence[j];
    if (sentence[j] == '\n')
    {
        if (counter >= 80)
        {
            current_sentence[counter + 1] = '\0'; // Make string null-terminated
            printf(":::HIT:::%s\n\n\n", current_sentence);
        }
        else
        {
            puts("Resetting counter");
        }
        counter = 0;
    }
    else
    {
        counter++;
    }
    j++;
}

free(current_sentence); // Free allocated memory

繰り返しますが、コメントで述べたように、あなたはむしろあなたfgetsのために仕事をさせたいと思っています。

于 2013-11-05T08:26:43.370 に答える
0
char *text[BUFFERSIZE];

する必要があります

char text[BUFFERSIZE];
于 2013-11-05T08:23:55.773 に答える