我有一个名为“test”的程序,它执行另一个名为“hello”的程序。在收到所需程序的名称后,我的程序似乎等待更多输入以显示“hello”程序代码。一段示例代码
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /* for fork */
#include <sys/wait.h> /* for wait */
int main() {
char *temp[] = {NULL,NULL,NULL,NULL};
char buf[BUFSIZ];
char s[256];
while(1) {
printf("type r at next input\n");
fgets(buf, sizeof(buf), stdin);
strtok(buf, "\n");
if((strcmp(buf,"r")) == 0) { //if r typed
printf("run what file : ");
scanf("%s ",s);
pid_t i = fork();
if (i == 0) //we are in child process
{
execv(s,temp);
_exit(1);
}
if (i != 0) { //parent
wait(NULL);
}
}
else
exit(0);
}
}
“你好”程序是......
#include<stdio.h>
main(int argc, char* argv[])
{
printf("\nHello World\n");
}
从linux上的shell运行示例是...... *表示我的输入,//是评论
issac@issac-ThinkPad-T440s ~$ ./a.out
type r at next input
*r*
run what file : *hello*
*r* //i cant proceed unless i type a character so i input *r*?
Hello World //after ?additional? input it finally displays the "hello" program code
type r at next input //loops back but program skips my input?
run what file ex ? hello :
我意识到这可能是一个简单的错误,但我无法弄清楚这是错误的。我意识到跳过输入的最后一部分可能是由于输入缓冲区中有换行符,但更令人困惑的是为什么在执行“hello”后我的程序等待更多输入来显示结果。
答案 0 :(得分:0)
要回答您的第一个问题:在scanf()
中删除一个尾随空格,使其如下所示:scanf("%s",s);
。
要回答第二个问题:您的问题是混合scanf()
和fgets()
。换行符不消费为scanf()
,并作为新输入传递给下一个(非第一个)fgets
。最简单的解决方案是在两个地方使用fgets
:
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /* for fork */
#include <sys/wait.h> /* for wait */
#include <string.h>
int main() {
char *temp[] = {NULL,NULL,NULL,NULL};
char buf[BUFSIZ];
char s[256];
while(1) {
printf("type r at next input\n");
fgets(buf, sizeof(buf), stdin);
strtok(buf, "\n");
if((strcmp(buf,"r")) == 0) { //if r typed
printf("run what file : ");
fgets(s, sizeof(s), stdin);
strtok(s, "\n");
pid_t i = fork();
if (i == 0) //we are in child process
{
execv(s,temp);
_exit(1);
}
if (i != 0) { //parent
wait(NULL);
}
}
else
exit(0);
}
}