my_shell程序中的字符串错误

时间:2016-10-14 12:39:50

标签: c system-calls string.h

我试图创建一个简单的shell程序来执行输入中指定的程序。有两个主要功能:scanner()(使用strtok分隔令牌中的输入)和execute()(分叉流程并执行程序)。

不幸的是,它不起作用......我已尝试在string[0]的末尾和scanner()的开头打印execute()。第一次输出正确,但第二次string[]似乎是按照随机数序列进行修改,因此execvp()不起作用......

我真的无法弄清楚为什么string[]的值会发生变化,可能是一个非常愚蠢的错误,但我无法看到它。我真的需要你的帮助!谢谢你的建议。

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

#define DIM 256

int scanner(char*[]);
int execute(char*[]);

int main()
{
    char* string[DIM]; 

    scanner(string);
    execute(string);

}

/* scan:    read the input in token*/
int scanner(char* string[])
{
    char input[1024];
    char delimit[]=" \t\r\n\v\f"; 
    int i = 0;

    if(fgets(input, sizeof input, stdin)) {
        string[i] = strtok(input, delimit);
        while(string[i]!=NULL){
            i++;
            string[i]=strtok(NULL,delimit);
        }
        return 0;
    }
    return 1;
}
/* execute:    execute the command*/
int execute(char* string[])
{
    int pid;
    printf("%s\n", string[0]);
    switch(pid = fork()){
        case -1:
            return 1;
        case 0:
            execvp(string[0], string);
            return 1;
        default:
            wait((int*)0);
            return 0;
    }
}

1 个答案:

答案 0 :(得分:3)

input中的字符串变量scanner是一个局部变量,存储类为&#34; auto&#34;。这意味着当该函数返回时,该变量消失,并且它占用的内存可以重新用于其他事情。这很不幸,因为strtok将指针返回到那个字符串变量。