#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 1024 //I assume that the maximum number of arguments is 1024
main()
{
char c;
char *temp;
char *arg[BUF]; //the commands
int i=1,j,k,iter=0;
while(1)
{
i=1;
iter=0;
printf("CS21> ");
temp = malloc(sizeof(char));
while((c=fgetc(stdin))!='\n')
{
temp = realloc(temp, i*sizeof(char));
temp[i-1]=c;
i++;
}
j=0;
while(j<strlen(temp))
{
if(temp[j]==' ')
{
j++;
continue;
}
if(temp[j]!=' ') //Line 38: Same check performed as Line 42
{
k=j;
arg[iter] = malloc(sizeof(char));
while(temp[k]!=' ') //Line 42: Segmentation Fault here
{
arg[iter] = realloc(arg[iter],(k-j+1)*sizeof(char));
arg[iter][k-j]=temp[k];
k++;
}
iter++;
k++;
j=k;
continue;
}
}
}
}
こんにちは、上記は私のカスタム シェル コードのサンプル コードです。プログラムが無限に続くことを疑問に思っている場合に備えて、私はまだコードを完成させていません。現在、ある行でセグメンテーション違反が発生しています (コメント済み) が、その理由がわかりません。38 行目で 42 行目と同じチェックを実行しましたが、セグメンテーション違反は発生しませんでした。誰でも私を助けることができますか?
上記の変数のいくつかの目的は次のとおりです。「temp」は、シェルに与えられたコマンド全体を保持するメモリ位置へのポインタです。「args」はポインタの配列で、各ポインタはコマンドの個々の引数を含むメモリ位置を指しています。
たとえば、"temp" は文字列 - gcc hello.c -o hello を保持します。これがシェルに渡された場合です。また、args[0] は「gcc」を指し、args[1] は「hello.c」などを指します。
それが、このコード サンプルの目的です。「temp」から空白を削除した後、すべての引数を「args」に格納します。while(1) ループは、ユーザーがシェルから exit コマンドを呼び出すと終了します。ただし、その部分は個別に行われます。このコードのサンプルを手伝ってくれる人はいますか?
ありがとう!