Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量在输入之前随机变为null_C_Ncurses - Fatal编程技术网

C 变量在输入之前随机变为null

C 变量在输入之前随机变为null,c,ncurses,C,Ncurses,所以,这是我的问题。我正在使用ncurses,当我按下向上或向下按钮时,它会显示向上箭头,因此我希望进入while循环,并获取进一步的输入。问题是,在这个过程中,变量输入不知何故变成了NULL,并且它存在。为什么呢?我想要的是打印向上或向下箭头,程序正常运行 int ch; char input[100]; initscr(); raw(); keypad(stdscr, TRUE); noecho(); ch = getch(); if(ch== KEY_UP) printf("\nU

所以,这是我的问题。我正在使用ncurses,当我按下向上或向下按钮时,它会显示向上箭头,因此我希望进入while循环,并获取进一步的输入。问题是,在这个过程中,变量输入不知何故变成了NULL,并且它存在。为什么呢?我想要的是打印向上或向下箭头,程序正常运行

int ch;
char input[100];
initscr();
raw();
keypad(stdscr, TRUE);
noecho();
ch = getch();
if(ch== KEY_UP)
    printf("\nUp Arrow"); fflush(stdout);

if(ch== KEY_DOWN)
    printf("\ndown Arrow");fflush(stdout);

endwin();

如上所述,输入未定义。此外,fgets用于文件输入流,而不是读取std输入流。(改为使用gets)

这是一个基于您的代码的SSCCE():

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

int main(void)
{
    int ch;
    char input[100];

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();
    ch = getch();
    endwin();

    if (ch== KEY_UP)
        printf("\nUp Arrow\n");

    if (ch== KEY_DOWN)
        printf("\ndown Arrow\n");

    fflush(stdout);

    while(1)
    {
        if (fgets(input, sizeof (input), stdin) == NULL) 
        {
            printf("Early exit\n");
            exit(0);
        }
        printf("Read: %s", input);
        fflush(stdout);
    }

    printf("Late exit\n");
    return 0;
}

除了标准输出上的缓冲外,它的所有行为都与我期望的一样。在这个程序中,没有办法到达
延迟退出
打印语句。

哪里定义了
输入
?@templatetypedef立即检查注意,尽管有缩进,两个
fflush(stdout)调用都是无条件进行的。您需要大括号(或逗号代替分号-ick!)使它们成为有条件的。要使
input
变为NULL,需要严重的错误处理。当你说“它是空的”时,你的确切意思是什么?是否从
fgets()
中获取空值?或者当您打印地址
input
时,它是零-在调试器中,还是在
printf()语句中?顺便说一句,通常最好以换行结束输出;如果需要双倍间距,则以换行符开始输出。不,不,不……您误解了发生的情况。当
fgets()
返回NULL时,表示在流上检测到EOF,或者流上发生错误。这并不意味着
input
已设置为NULL。当然,如果一切顺利,
fgets()
的返回值将是作为第一个参数传递的指针(
input
)。但是返回值为NULL并不意味着
input
已设置为NULL!从
manget
:“永远不要使用gets()。因为在不事先知道数据的情况下无法判断gets()将读取多少个字符,而且由于gets()将继续存储超过缓冲区末尾的字符,因此使用它是极其危险的。它被用来破坏计算机安全。请改用fgets()。”是的,你说得对。我完全忘记了get()不强制边界。所以,听上面的人说不要使用gets()。我是一个使用Mac、netbeans的人,我提前退出了。向上箭头提前退出运行成功(总时间:1s)我不知道如何使用NetBeans,就像我不知道如何使用XCode或Eclipse一样。我无法解释为什么你会立即“提前退出”。我不认为您使用的终端程序应该是一个因素(但我使用的是
/Applications/Utilities/terminal
)。我不认为shell应该是一个因素(但我使用的是
/bin/sh
,也就是
bash
)。如果在NetBeans中编译并直接从终端运行会发生什么?哪个终端应用程序?Mac OS X的哪个版本?当我这样做时,我得到:
gfmt1:cflag=4b00:iflag=6b02:lflag=200005cb:oflag=3:discard=f:dsusp=19:eof=4:eol=ff:eol2=ff:erase=7f:intr=3:kill=18:lnext=16:min=1:quit=1c:reprint=12:start=11:status=14:stop=13:susped=1a:time=0:werase=17:ispeed=9600:ospeed=9600。用法:
echo stty-g$(stty-g)>sane;chmod+x sane
记录您当前的tty设置。然后使用
stty-g…
将点替换为我刚才粘贴的字符串。然后运行程序,看看是否有什么不同。您可以使用
/sane
恢复设置。
$ ./curses

Up Arrow
sssddd
Read: sssddd
Early exit
$