[英]Redirection input in C: fgets() end of line “\n” interfering with strcmp()
[英]C: fgets() and command line input
我正在尝试编写一个处理过程的程序。 将提示用户。
shell: start emacs file.c
Process 346 has started.
我在使用fgets时遇到了一些问题,因为我不知道在第三个参数(我希望它从命令行/ argv接受)中添加什么
fgets(缓冲区,4096,如果我不做文件, 只是argv ,我该如何做文件指针?)
int main(int argc, char **argv)
{
while(1) {
printf("shell: ");
int status, pid;
int i=0;
char buffer[4097];
fgets(buffer, 4096, ???? ) //I want it to take in from argv. Do I need to declare 4096?
if(strcmp(argv[1],"start") == 0 )
{ printf("myshell: process has started \n");
while (str = strtok(buffer," ") = NULL) //??? What do I declare str as?
argv[i] = str;
i = i+1;
}
if ((pid = fork()) < 0) { //Child process fork
perror("fork");
exit(1);
}
if (pid == 0) { //Child executes code
execvp(argv[0], argv );
perror(argv[1]); //argv1?
exit(1);
}
}
这对上面解释的期望行为有意义吗? 我不确定strtok的while循环的位置,也不知道是否可能必须在if语句之外。
另外,将我的strtok函数称为strtok(buffer,“”)是否正确? 谢谢。
I don't know what to put as my third argument ??
在手册页中
char *fgets(char * restrict s, int n, FILE * restrict stream);
因此,第三个参数是FILE
指针。 由于argv
是指向字符串的指针,因此您不能在fgets()
中使用它。
您可以使用strcpy()
系列函数直接使用或复制到某些本地缓冲区。
当您通过终端启动程序时,您完全错了我的朋友(./your_program argv1 argv2 ... argvN)argv由系统传递给主函数,但是启动程序后,所有内容都不会存储在argv中,即
./your_program argv1 argv2 //在这里您可以从系统外壳收集字符串输入:start emac file.c //这不会存储到argv中
要获取这些值,您可以执行以下操作:fgets(buffer,4096,stdin)//从控制台进入缓冲区,而不是在argv中
然后,您可以使用字符串标记处理程序函数从缓冲区中获取每个值,我不知道字符串标记处理程序的确切语法或程序,但是此链接将为您提供帮助http://www.cplusplus.com/reference/cstring/strtok/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.