Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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
Java C printf无法从终端正常工作_Java_C++_C_Command Line_Terminal - Fatal编程技术网

Java C printf无法从终端正常工作

Java C printf无法从终端正常工作,java,c++,c,command-line,terminal,Java,C++,C,Command Line,Terminal,我已经尽可能地将问题简化为以下最小的代码片段。如果需要更多信息,请询问 假设我有一个名为a的Java类,其主要方法如下: public static void main (String args[])throws Exception{ Process p = new ProcessBuilder(args).redirectErrorStream(true).start(); Scanner in = new Scanner(new InputStreamReader(p.get

我已经尽可能地将问题简化为以下最小的代码片段。如果需要更多信息,请询问

假设我有一个名为a的Java类,其主要方法如下:

public static void main (String args[])throws Exception{
    Process p = new ProcessBuilder(args).redirectErrorStream(true).start();
    Scanner in = new Scanner(new InputStreamReader(p.getInputStream())); 
    System.out.println(in.nextLine());
}
基本上,它从终端运行一个程序,从该程序中读入一行,并进行响应。很简单

现在我有第二个C++程序,像这样:

int main() 
{
    string s;
    cout << "example2 in c++"<<endl;;
    cin >> s;
    return 0;
}
int main()
{
   printf("example1 in c\n");
   return 0;
}
程序按预期运行,输出从cpp程序发送的字符串并终止

我有一个c语言的等效程序:

int main()
{
   char s[10];
   printf("example1 in c\n");
   fgets(s,10,stdin); 
   return 0;
}
当我调用:

java A pathToC++Program
java A pathToCprogram
程序停止,没有打印任何内容

当我从c程序中删除fgets行时,它如下所示:

int main() 
{
    string s;
    cout << "example2 in c++"<<endl;;
    cin >> s;
    return 0;
}
int main()
{
   printf("example1 in c\n");
   return 0;
}
然后,Java程序能够识别该行并将其打印出来。因此,fgets似乎是一条有问题的线路,但当fgets被包括在内时,甚至之前的线路也不起作用

这是怎么回事


(我不知道这是java还是C++的特性,所以我把两个标签都包括进去了)

传递<代码>:STD::EntL//C> > <代码> STD::CUT/<代码>将刷新输出缓冲区。
要在C中刷新输出缓冲区,应该添加
fflush(stdout)printf
行后的code>。

写入
stdout
(这是
printf
将写入其输出的地方)是缓冲行,这意味着缓冲区将在换行时刷新

但是这是直接从终端运行时的默认设置。如果输出不是终端,则
stdout
将被完全缓冲,这意味着只有在填充缓冲区时才会刷新。或者到显式的
fflush(stdout)
调用

<>在C++程序中,你可以通过使用<代码> STD::EntL< /Cube >(输出一个换行并刷新缓冲输出)来显式刷新输出。在C程序中,输出缓冲区没有这种刷新

这确实是非常特定于平台的,但对于POSIX平台(如Linux或macOS),它与上面描述的一样。我认为这与Windows非常相似


至于为什么删除
fgets
语句时它会起作用,可能是因为
fgets
将阻止执行,直到文件结束或读取了某些(换行终止的)输入。如果没有
fgets
,程序将在
printf
之后立即退出,这将导致
stdout
缓冲区被刷新。

您调用
fgets
的意图是什么?您没有对已读入的字符串执行任何操作。执行的是gets works而不是FGET。我知道我们不应该使用gets,但我想确保缓冲区在这里不起作用either@AshraffAliWahab:永远不要使用
获取
!自7年以来,它就不是标准库的一部分,20多年来,即使是思维迟钝的人也不赞成它。它也无法改变输入方面的行为,因为它在引擎盖下使用与
fgets
相同的机制,只是不安全。再次重申:这不是“你不应该使用它”,而是“你不应该使用它”。忘了它曾经存在过。谢谢。我已经在我的评论中提到过。如果格式字符串中存在换行符(
\n
),输出将被刷新。输出缓冲与
fgets
)有什么关系?@user1810087有问题的代码是用C编写的,网站上有很多问题都提到了与换行符刷新相关的问题。啊,谢谢我感觉缓冲区没有被冲走,但我不明白为什么newline没有这么做。是的,我使用的是windows,你也被纠正了,即使你没有使用
std::endl
(或者
std::flush
,或者
std::cout.flush()
),默认情况下,
std::cin
std::cout
是绑定在一起的,所以调用
std::cin>>…
会自动刷新
std::cout
,如果它还没有刷新的话