2014-01-23 5 views
0

Я пытаюсь реализовать оболочку типа UNIX. Я не реализовал оболочку, создающую дочерний процесс для запуска каждой части команды, но это всего лишь код, чтобы сломать строку, введенную в командной строке пользователем, в соответствующие аргументы, используя пробел в качестве разделителя, который затем будет передается в файл, соответствующий команде (например, ls -l) в качестве аргументов командной строки.Имитация оболочки типа UNIX

Это нормально работает на моей ОС 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

[не отбрасывают возвращаемое значение стандартных функций Allocator] (http://stackoverflow.com/questions/605845/do-i-cast- заместитель на результат из-таНоса/605858 # 605858). –

+2

Можете ли вы скопировать и вставить точное сообщение об ошибке вместе с любой командой, введенной вами на терминале? –

+0

компилируется ли он на ubuntu? какой компилятор вы используете? – Dipto

ответ

1

Под БГД, я получаю:

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

т.е. вы используете указатель, который указывает указатель, который указывает на ничего использовать: это неопределенное поведение, и это может быть, почему вы получить странные вещи, как «» Неопределенного символ «Printf» версии ABC. ", или ошибка сегментации при БГДЕ.

Я предлагаю вам переписать fonction 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; 
} 
Смежные вопросы