0

printf() が正しく認識しているファイルからの文字列で行列を埋めましたが、printw() は残りのコードと一致していないようです。通常の文字列では機能しますが、そのマトリックスの文字列では機能しません。

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

int main (int argc, char const *argv[])
{
    char** matrice = malloc(sizeof(char*)*51);
    size_t nbytes;
    int i = 0, j = 0;

    FILE* lab = fopen(argv[1], "r");

    while((getline(&matrice[i], &nbytes, lab) != -1))
    {
        i++;
    }
    printf("%s", matrice[0]);
    getchar();
    initscr();          /* Start curses mode        */
    cbreak();           /* Line buffering disabled  */
    keypad(stdscr, TRUE);       /* We get F1, F2 etc..      */
    noecho();           /* Don't echo() while we do getch */
    printw(matrice[0]);
    printw("dummy line"\n);
    refresh();
    getch();
    endwin();
    return EXIT_SUCCESS;
}
4

1 に答える 1

2

これは とは関係ありませprintw()ん。メモリを正しく割り当てていないだけです。ここ:

char** matrice = malloc(sizeof(char*)*51);

実際の文字列にメモリを割り当てません。51 個のポインタにメモリを割り当てますが、それらが指すメモリを割り当てません。getline()したがって、呼び出しは未割り当てのメモリに読み込もうとしており、未定義の動作が発生します。プログラムが適切に動作するようになるまで、すべての賭けはオフです。

これらの 51 個のポインターのそれぞれにいくらかのメモリを割り当てるか、単に静的配列を使用する必要があります。

書かれているように、最後にfree()メモリに失敗し、実際にメモリを提供したかどうかを確認するためにmalloc()からの戻り値をチェックしません。malloc()

このようなものがあなたが望むものです:

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

#define ARRSIZE 51
#define STRSIZE 100

int main(void) {
    int i;

    char ** matrice = malloc(ARRSIZE * sizeof(*matrice));
    if ( matrice == NULL ) {
        fputs("Couldn't allocate memory!", stderr);
        return EXIT_FAILURE;
    }

    for ( i = 0; i < ARRSIZE; ++i ) {
        matrice[i] = malloc(STRSIZE);
        if ( matrice[i] == NULL ) {
            fputs("Couldn't allocate memory!", stderr);
            return EXIT_FAILURE;
        }
    }

    /* Rest of your program */

    for ( i = 0; i < ARRSIZE; ++i ) {
        free(matrice[i]);
    }
    free(matrice);

    return 0;
}

編集:本当に を使用したい場合getline()は、元のプログラムのバージョンを次に示します。

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

int main(int argc, char const *argv[]) {
    size_t nbytes = 0;
    int i = 0, j = 0;

    if ( argc < 2 ) {
        fputs("You must specify a file name!", stderr);
        return EXIT_FAILURE;
    }

    FILE *lab = fopen(argv[1], "r");
    if ( lab == NULL ) {
        fputs("Couldn't open file!", stderr);
        return EXIT_FAILURE;
    }

    char **matrice = malloc(sizeof(char *) * 51);
    if ( matrice == NULL ) {
        fputs("Couldn't allocate memory!", stderr);
        return EXIT_FAILURE;
    }

    for ( j = 0; j < 51; ++j ) {
        matrice[j] = NULL;
    }

    while ( i < 50 &&
            (getline(&matrice[i], &nbytes, lab) != -1) ) {
        i++;
    }

    if ( i == 0 ) {
        fputs("File was empty.", stderr);
        free(matrice[0]);
        free(matrice);

        return EXIT_FAILURE;
    }

    printf("%s", matrice[0]);
    getchar();
    initscr();                  /* Start curses mode        */
    cbreak();                   /* Line buffering disabled  */
    keypad(stdscr, TRUE);       /* We get F1, F2 etc..      */
    noecho();                   /* Don't echo() while we do getch */
    printw(matrice[0]);
    printw("dummy line\n");
    refresh();
    getch();
    endwin();

    for ( j = 0; j <= i; ++j ) {
        free(matrice[j]);
    }
    free(matrice);

    return EXIT_SUCCESS;
}

ただし、独自のメモリを割り当てて使用するfgets()方が優れています.ncursesのようなサードパーティのライブラリを最初から使用している場合でも、完全に標準的な方法がある場合は、非標準の拡張機能を使用する必要はありません.

于 2013-08-25T14:59:20.313 に答える