Используйте getchar()
перед вызовом второго scanf()
.
scanf("%c", &c1);
getchar(); // <== remove newline
scanf("%c", &c2);
Какую ОС вы используете? В ОС Unix-семейства (например, Linux, MacOS) программы ожидают, что процесс оболочки расширит аргументы имени файла подстановки и передаст расширение в argv[]
. В ОС Windows программы обычно ожидают расширения самих подстановочных знаков (хотя только в том случае, если они являются родными для Windows программ; портированные Unix-семейные программы могут попытаться запустить аргументы через уровень совместимости).
Ваш синтаксис выглядит так, как будто для системы Unix-семейства. Если это так, то при вызове spawn()
вы обходите расширение оболочки, и ваш дочерний процесс будет обрабатывать точки и звездочки в аргументах буквально. Попробуйте использовать sh child_process
вместо child_process
и посмотрите, получите ли вы лучшие результаты.
*
расширяется оболочкой, а для child_process.spawn
аргументы проходят через строки, поэтому они никогда не будут должным образом расширены. Это ограничение spawn
. Вместо этого вы можете попробовать child_process.exec
, это позволит оболочке правильно расширять любые подстановочные знаки:
var exec = require("child_process").exec;
var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) {
// Handle result
});
Если вам действительно нужно использовать spawn
по какой-то причине, возможно, вы могли бы рассмотреть возможность расширения шаблона шаблона
В базовом коде Joyent Node мы можем наблюдать подход к узлу с lib как node-glob вызывая произвольную команду в оболочке через spawn
, сохраняя полное расширение подстановки оболочки:
И вот какой-то псевдокод:
var child;
var cmd = "doSomething ./myfiles/*.csv";
if ('win32' === process.platform) {
child = spawn('cmd.exe', ['/s', '/c', '"' + cmd + '"'],{windowsVerbatimArguments:true} );
} else {
child = spawn('/bin/sh', ['-c', cmd]);
}