2014-01-23 36 views
0

我想实现UNIX类型的shell。我还没有实现shell创建一个子进程来运行每个命令部分,但这只是一个代码,用于将用户在命令提示符下输入的字符串分隔为合适的参数,并将空格作为分隔符,然后传递给与该命令相对应的文件(比如ls -l)作为命令行参数。模拟UNIX类型的shell

它在我的Windows 7操作系统上运行正常,但是当我在Ubuntu上运行它并输入字符串为“ABC XYZ WGH”时,出现错误,说“Undefined symbol'printf'version ABC。” 请帮我理解,我哪里出错了?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int arguments(char str[],char *** args) 
{ 
    char *s; 
    int num; 
    int i; 
    s=(char*)calloc(strlen(str)+1,sizeof(char)); 
    strcpy(s,str); 
    if(strtok(s," ")==NULL) 
    num=0; 
    else 
    { 
     num=1; 
     while(strtok(NULL," ")!=NULL) 
     num++; 
    } 
    strcpy(s,str); 
    **args=strtok(s," "); 
    if(num) 
    { 
     for(i=1;i<num;i++) 
     *((*args)+i)=strtok(NULL," "); 
    } 
    return num; 
} 


int main() 
{ 
    char buffer[256]; 
    char **arg; 
    int args; 
    int i; 
    while(true) 
    { 
      gets(buffer); 
      if(!strcmp(buffer,"STOP")) 
      break; 
      args=arguments(buffer,&arg); 
      printf("%d\n",args); 
      for(i=0;i<args;i++) 
      printf("%s\n",arg[i]); 

    } 
    return 0; 
} 
+0

[不投的标准分配函数的返回值(http://stackoverflow.com/questions/605845/do-i-cast-在对结果的-的malloc/605858#605858)。 – 2014-01-23 15:20:43

+2

您是否可以复制并粘贴确切的错误消息,以及您在终端键入的任何命令? –

+0

在ubuntu上编译过吗?你正在使用哪个编译器? – Dipto

回答

1

在gdb下,我得到:

Program received signal SIGSEGV, Segmentation fault. 0x00000000004007a8 in arguments (str=0x7fffffffe010 "", args=0x7fffffffe000) at u.c:20 20 **args=strtok(s," ");

即您使用指向指向任何可用的指针的指针:这是不确定的行为,这可能是为什么你得到奇怪的东西,如“未定义的符号'printf'版本ABC。”,或gdb下的分段错误

我建议你用更少的间接级别重写函数arguments()(并更好地使用strtok() = ),但现在这个代码可以做你想做的:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 32 

int arguments(char str[],char **args) 
{ 
    char *s; 
    int num; 
    int i; 
    s=malloc(strlen(str)+1); 
    strcpy(s,str); 
    if(strtok(s," ")==NULL) 
     num=0; 
    else { 
     num=1; 
     while(strtok(NULL," ")!=NULL) 
     num++; 
    } 
    strcpy(s,str); 
// **args=strtok(s," "); 
    *args=strtok(s," "); 
    if(num) 
    { 
     for(i=1;i<num;i++) 
//   *((*args)+i)=strtok(NULL," "); 
      args[i] = strtok(NULL," "); 
    } 
    return num; 
    // note. 's' is not free()'d .. 
} 

int main() 
{ 
    char buffer[256]; 
    char *arg[MAX]; 
    int args; 
    int i; 

    while(1) 
    { 
      gets(buffer); 
      if(!strcmp(buffer,"STOP")) 
       break; 
      args=arguments(buffer, arg); 
      printf("%d\n",args); 
      for(i=0;i<args;i++) 
       printf("%s\n",arg[i]); 

    } 
    return 0; 
}