2016-11-05 11 views
0

私はシェルのシミュレーションを行う大学のプロジェクトに問題があります。ユーザーがコマンドを入力すると、プログラムはその行をトークンに分割し、その内の1つがcd、export、jobs、sourceなどの内部コマンドであるかどうかをチェックします。次に、トークンと、その行にあるコマンドの基本的な説明を表示します。 CodeBlocksを実行するとすべてうまく動作しますが、LinuxのNetBeansでコンパイルすると、コードで説明するいくつかの警告が表示され、実行時にこのメッセージが表示されます:セグメンテーションフォルト(コアダンプ)。私はそれについて研究してきましたが、これはメモリのアクセス権(アクセスが許可されていないメモリの一部にアクセスする)と関係していることがわかりました。私はそれを解決する方法を見つけることができませんが、私はここに誰かが私を助けることを願っています。ありがとう!ポインタの問題C.セグメンテーションフォールト

#include <stdio.h> 
#include <stdlib.h> 
#define PROMPT "$" 

int parse_args(char **args, char *line){ 
    char *token; 
    int n=0; 
    token=strtok(line," "); // warning: assignment makes pointer from integer without a cast 
    while(token!=NULL){ 
     printf("token%i: %s\n",n,token); 
     *args=token; 
     n++; 
     *args++; 
     token=strtok(NULL," ");// warning: assignment makes pointer from integer without a cast 
    } 
    printf("token%i: %s\n",n,token); 
    *args=token; 
    return n; 
} 

char *read_line(char *line){ //expecting argument char* but argument is of type char** 
    printf("%s ",PROMPT); 
     *line = malloc(sizeof(500));//warning: assignment makes pointer from integer without a cast 
    fgets(line,500,stdin); 
    return line; 
} 


int execute_line(char *line){//expecting argument char* but argument is of type char** 
    char**args; 
    parse_args(args,line); 
    check_internal(args); 
    return 0; 
} 

int check_internal(char **args){ 
    if(strcmp(*args, "cd")==0){ 
internal_cd(); 
    } else{ 
     if(strcmp(*args, "export")==0){ 
      internal_export(); 
     }else{ 
      if(strcmp(*args, "source")==0){ 
       internal_source(); 
      }else{ 
       if(strcmp(*args, "jobs")==0){ 
        internal_jobs(); 
       }else{ 
        printf("%s","pasa los ifelse\n"); 
        return 0; 
       } 
      } 
     } 
    } 
} 


int internal_cd(char **args){ 
    printf("%s","cambio de directorio\n"); 
    return 1; 
} 

int internal_export(char **args) { 
    printf("%s","éste es el export\n"); 
    return 1; 
} 

int internal_source(char **args) { 
    printf("%s","éste es el source\n"); 
    return 1; 
} 

int internal_jobs(char **args){ 
    printf("%s","éste es el jobs\n"); 
    return 1; 
} 

void main(){ 
    char *line; 
    while(read_line(&line)){//warning: imcompatible pointer type 
     execute_line(&line);//warning: incompatible pointer type 
    } 
    //free line here?? 
} 
+1

コンパイラが警告を読みます。彼らが意味することを理解しよう。彼らは本当に間違っていることをあなたに伝えています。変数を修正します(例:変数をキャストするのではなく、警告があなたに伝えていることを理解して根本原因を修正します)。 –

+2

'man strtok'を読み込み、' #include ' –

答えて

1

問題は2つあります。

まず、あなたが同じ

char *read_line(char *line) 

read_line(&line); 

execute_line()のために行くように、char *を取るために機能を設計したが、それはchar **を受け入れることを期待しています。

malloc(sizeof(500)); 

があなたの代わりに欲しいだけ

malloc(sizeof(int)); 

と同じである第二

は、malloc()として

malloc(500); 

は、メモリのサイズへの引数を取るですバイト単位で割り当てられます。

関連する問題