私はシェルのシミュレーションを行う大学のプロジェクトに問題があります。ユーザーがコマンドを入力すると、プログラムはその行をトークンに分割し、その内の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??
}
コンパイラが警告を読みます。彼らが意味することを理解しよう。彼らは本当に間違っていることをあなたに伝えています。変数を修正します(例:変数をキャストするのではなく、警告があなたに伝えていることを理解して根本原因を修正します)。 –
'man strtok'を読み込み、' #include ' –