【问题标题】:C: fgets() and command line inputC: fgets() 和命令行输入
【发布时间】:2014-02-19 10:44:28
【问题描述】:

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

shell: start emacs file.c
Process 346 has started.

我在使用 fgets 时遇到了一些问题,因为我不知道该放什么作为我的第三个参数(我希望它从命令行/argv 中获取)

fgets(buffer, 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, " ") 是否正确?谢谢。

【问题讨论】:

  • 听起来有人需要阅读一些手册页...
  • char buffer[4097]; fgets(buffer, sizeof buffer, ...
  • 为了澄清,我确实在手册页中看到第三个参数是“FILE * 限制流”,但我不知道究竟是什么,因为我不接受任何文件输入并且通常它是一个指向文件的指针。
  • @user3295684 你说启动 emacs file.c 所以你的第三个参数是 file.c。因此,假设您首先打开该文件并在 fgets 函数的第三个参数中传递该文件的 FILE 指针。
  • @JKB 知道了,就像 FILE *src = fopen(argv[3],"r"); fgets(缓冲区,MAX,src);谢谢!

标签: c fgets strtok


【解决方案1】:
 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() 系列函数直接使用或复制到某个本地缓冲区。

【讨论】:

  • 所以我可以做类似 fgets(buffer, 4096, argv) 之类的事情?
  • @user3295674 不,不是 argv,而是从 argv 你得到文件名。所以首先打开文件并传递它的文件指针。
【解决方案2】:

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

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

要重视那些价值,你可以这样做 fgets(buffer, 4096,stdin) // 从控制台到你的缓冲区而不是在 argv 中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2017-03-13
    • 2010-12-19
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多