我用一个文件中的字符串填充了一个矩阵,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;
}
最佳答案
这与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。关于c - ncurses的printw()不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18430164/