簡體   English   中英

C:fgets()和命令行輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM