Я максимально уменьшил проблему до следующих минимальных фрагментов кода.Если вам нужна дополнительная информация, пожалуйста, спросите.
Допустим, у меня есть класс Java с именем A, основной метод которого таков:
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;
}
Когда я вызываю:
java A pathToC++Program
, программа запускается, как ожидается, с выводомстрока, отправленная из программы cpp и завершающаяся.
У меня есть эквивалентная программа на c:
int main()
{
char s[10];
printf("example1 in c\n");
fgets(s,10,stdin);
return 0;
}
Когда я вызываю:
java A pathToCprogram
, программа останавливается,и ничего не распечатывается.
Когда я удаляю строку fgets из программы c, чтобы она выглядела следующим образом:
int main()
{
printf("example1 in c\n");
return 0;
}
, тогда программа Java может распознать строку и напечататьэто из.Таким образом, может показаться, что fgets является проблемной строкой, но когда была включена функция fgets, даже строка до того, как она не сработала.
Что здесь происходит?
(Понятия не имеюесли это особенность Java или C, поэтому я включил оба тега.)