C:fgets()和命令行输入

时间:2014-02-19 01:59:17

标签: c fgets strtok

我正在尝试编写一个处理进程的程序。 将提示用户..

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);
             }
    }

这是否符合上述所需的行为?我不完全确定我的while循环的位置有strtok,不知道是否可能必须在if语句之外。

另外,我的strtok函数被称为strtok(buffer,“”)是否正确?谢谢。

2 个答案:

答案 0 :(得分:0)

 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()系列函数直接使用或复制到某个本地缓冲区。

答案 1 :(得分:0)

你完全是我的朋友 当你通过终端启动程序时(./your_program argv1 argv2 ... argvN)argv由系统传递给main函数,但是在启动程序后,没有任何东西会存储在argv中,即

./ your_program argv1 argv2 //在这里你可以收集系统的字符串输入 shell:启动emac file.c //这不会存储到argv

要获得价值,你可以做那样的价值    fgets(buffer,4096,stdin)//从控制台进入缓冲区而不是argv

之后,您可以使用字符串tokeniser函数从缓冲区中获取每个值 我不知道字符串标记符的确切语法或程序,但此链接将帮助您 http://www.cplusplus.com/reference/cstring/strtok/