宿題、手伝おっか?

このエントリーをはてなブックマークに追加
シェルの作成についての課題なのですが、

MyshellはCshellと違って、Cで実行できていたコマンドや機能のうち
働かないものがある。これらを調べ、どのような機能が実行できないか、
なぜできないか、どのような機能を追加すればいいか?

例えば次のが実行できない

エイリアス、ヒストリー、ワイルドカード、ファイルへのリダイレクト、
shellプログラミング、ディレクトリー操作(popd、pushdなど)

これらから4つほど(エイリアス、ヒストリーは必須)をmyshellに追加せよ。

という課題です。助けてください、お願いします。できればソースを、、。
>>949
Myshellは一般的なものじゃないので、それがどんなものか
教えてくれないとわかんないよーん。
951949:02/05/05 01:06
>>950様、これです#include<stdio.h>
#define MAXARGS 10 /* 許されるコマンドの引数の最大の数 */
#define LINELENGTH 80 /* コマンドラインの最大文字数 */
#define CONTINUE 1
#define EXITCOM 0

main(int argc,char* argv[])
{
char linebuf[LINELENGTH];
int hist;

for(hist=1; ;hist++){
printf("myshell[%d] ",hist);

    gets(linebuf);
  
if(exec_one_command(linebuf)==EXITCOM) break;
}
}
char *skipspace(char* s)
{
while(*s==' ') s++;

return s;
}

952949:02/05/05 01:07
int getcl(char* line,char* argmv[])
{
int argnum=0;

do{
line=skipspace(line);
if(*line=='\0'){
argmv[argnum]=NULL;
return argnum;
}
argmv[argnum++]=line;
while(*line!='\0' && *line!=' ') line++;
if(*line=='\0'){
argmv[argnum]=NULL; return argnum;
}
*line='\0'; line++;
}while(1);
}

int exec_one_command(char linebuf[])
{
int argnum, status;
char *argmv[MAXARGS];

argnum=getcl(linebuf,argmv);
if(argnum==0) return CONTINUE;

if(strcmp(argmv[0],"exit")==0){
return EXITCOM;
}
if(fork()==0){
execvp(argmv[0],argmv);
printf("Error at execvp\n");
exit();
}
wait(&status);
return CONTINUE;
}

953950:02/05/05 01:32
>>951
おぉぉ。おもしろいね。コレ。
で、まず
エイリアス:
1.exec_one_command()で、alias っていうコマンドが来たら、第2引数(エイリアス名)と第3引数以降(コマンド)を何か(alias_bufと名づけよう)に保存。
2.exec_one_command()で、alias_bufに登録してあるエイリアス名を探して、存在すれば、保存してあるコマンドを代わりに実行する。

ヒストリ:
1.exec_one_command()で、コマンドを実行するたび、何か(history_buf[hist]としよう)に保存していく。
2.exec_one_command()で、!数字 っていうコマンドが来たら、代わりにhistory_buf[数字]に保存しといたコマンドを実行する。

でできるよ。簡単簡単。
あと簡単そうなのは、shellプログラミング(制御構造が無い、batファイルみたいな単純なの)と、
ディレクトリ操作かなぁ。ワイルドカードも、そんなに難しくないかも。リダイレクトは、ちと難しい。
954949:02/05/05 02:34
>>950
丁寧な説明、ありがとうございます!
おもしろい、、のでしょうか?(汗
僕もそう思える日がくればいいなぁ、、。
(冗) <フムフムソレカラ?
956デフォルトの名無しさん:02/05/06 00:47
ageてみるか
957デフォルトの名無しさん:02/05/06 00:54
そろそろ新スレを誰か。
958玉三郎:02/05/06 00:56
ワシの出番か・・・
>>958
玉三郎が宿題を教えてくれても、あまり嬉しくないぞ
960玉三郎:02/05/06 01:06
こら誰が金玉三郎じゃヽ(`Д´#)ノ
玉三郎は、金玉三郎と… φ(.. )
962デフォルトの名無しさん:02/05/06 01:12
そういや、えれながいつのまにか消えたな・・・
最多真鯛の宿題か…
えれなや怜って演じてる奴何回くらい変わってんだろ?
>>949はマルチポスト厨房
無視が一番
968まとめ:02/05/06 09:58
969えれな:02/05/06 20:05
>962
呼んだ?
970デフォルト:02/05/07 21:41
#include<stdio.h>

void main(void)

{
int a;

a = 10;
}

上のプログラムを実行すると「aの値は10です」と
出力するようにするにはどうしたら良いのでしょうか?
(%dを使って)
>>970

%dとまでいってて、何がわからないの?
もしかして全角でってこと?
972デフォルトの名無しさん:02/05/07 22:50
その前にニホンゴができてないな。
母国語なんだろうけどいいたいことを正確に伝えられない
言語障害者はプログラミング言語をつかっても駄目なこと多いよ。
973初心者:02/05/07 23:04
簡単なアルゴリズムを教えてください。
問題は
「キーボードから文字列を読み込んで,
読み込んだ文字列を逆にした文字列を表示する」解答 I94==>49I
という問題なのですが。。配列でやったのですが。。。
>>973
スタック使え...。多分これだけでは、ちんぷんかんぷんだろうから、
スタックを配列で作れ。とまでは言っておこう。
配列でやったならあとは一文字ずつ...
976デフォルト:02/05/07 23:14
>>971
自分、超初心者なんで%dも良く分からないです。
全角でとは、どういう事ですか?
文字を入力してカウントするプログラムで

main()
{
int i=0,j;
while(j=getchar()){
if(j==EOF)break;
i++;
}
printf("文字数は%dです。\n",i);
}

と記述したのですが、
どうしても文字数+1となります。
なぜでしょうか?
978初心者:02/05/07 23:23
973ですが、スタックってキューとかって
実際今まで使ったことがないのでわかりません。
基本情報を勉強したときに障った程度です。

配列でいこうと思っているのですが。。。
979素人。:02/05/07 23:25
printf("aの値は10です\n%d%c%c",a,0x08,0x08);

あってる?
980素人。:02/05/07 23:27
getchar()
で開業コードもカウントされるからですかな。
と書いてみるテスト。
981977:02/05/07 23:31
>>980

どうやって回避すればいいのでしょうか?>改行コード
printf("",i-1);
とすると何も入力しないとき-1が帰ってくるので困ってます。
>>973
#define MAX_LINE 2000
int ri;
char line[MAX_LINE];
while(1){
fgets(line,MAX_LINE,stdin);
for(ri = strlen(line)-2;ri>=0;i--)
putchar(line[ri]);
putchar('\n');
}
//toka
983素人。:02/05/07 23:33
strlen
とか使えばいいのではないかしら。
984977:02/05/07 23:36
>>983
すみません。getcharつかうのが前提なんです。(・∀・;)
>>984
なら、改行コード('\n')のときは i++ しないってので、どぉ?
while(j=getchar()){
if(j==EOF)break;
else if(j=='\n')continuel
i++;
}
//違ったらごめん
l → ;
>>982
エラー: 'i' が未定義です。
警告: MAX_LINE より MAX_CHARS のほうがより良いと思います。
警告: プログラムが終了できない可能性があります。EOF を入力したら
   ちゃんと終了するように作りましょう。
#define MAX_LINE 2000
int ri; char line[MAX_LINE];
while(fgets(line,MAX_LINE,stdin) > 0){
for(ri = strlen(line)-2;ri>=0;ri--)
putchar(line[ri]);
putchar('\n');
}
//tekito desuga dozo
990977:02/05/07 23:48
>>986
それでいけました。ありがとです。ヽ( ´ー`)ノ
continueてのは初めて聞きましたよ。
>>973
#include <stdio.h>

rev_put(ch)
{
 if (ch != '\n') {
  rev_put(getchar());
  putchar(ch);
 }
}

main()
{
 rev_put(getchar());
}
992素人。:02/05/07 23:52
mov cx,200
hoge:
mov ah,07h
int 21h
push
loop hoge
mov cx,200
hogehoge:
pop dl
mov ah,02h
int 21h
loop hogehoge

あってる?
>push
994素人。:02/05/07 23:53
push al
ね。
なにがやりたいのかわからん
>>991
そんなのアリか?
997そろそろ:02/05/07 23:55
1000!!!!
998そろそろ:02/05/07 23:56
1000!!!!

999そろそろ:02/05/07 23:56
ほいしょ。
せん。
はいはい
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。