シェルの作成についての課題なのですが、
MyshellはCshellと違って、Cで実行できていたコマンドや機能のうち
働かないものがある。これらを調べ、どのような機能が実行できないか、
なぜできないか、どのような機能を追加すればいいか?
例えば次のが実行できない
エイリアス、ヒストリー、ワイルドカード、ファイルへのリダイレクト、
shellプログラミング、ディレクトリー操作(popd、pushdなど)
これらから4つほど(エイリアス、ヒストリーは必須)をmyshellに追加せよ。
という課題です。助けてください、お願いします。できればソースを、、。
>>949 Myshellは一般的なものじゃないので、それがどんなものか
教えてくれないとわかんないよーん。
>>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;
}
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;
}
>>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ファイルみたいな単純なの)と、
ディレクトリ操作かなぁ。ワイルドカードも、そんなに難しくないかも。リダイレクトは、ちと難しい。
>>950様
丁寧な説明、ありがとうございます!
おもしろい、、のでしょうか?(汗
僕もそう思える日がくればいいなぁ、、。
(冗) <フムフムソレカラ?
956 :
デフォルトの名無しさん:02/05/06 00:47
ageてみるか
957 :
デフォルトの名無しさん:02/05/06 00:54
そろそろ新スレを誰か。
ワシの出番か・・・
>>958 玉三郎が宿題を教えてくれても、あまり嬉しくないぞ
こら誰が金玉三郎じゃヽ(`Д´#)ノ
玉三郎は、金玉三郎と… φ(.. )
962 :
デフォルトの名無しさん:02/05/06 01:12
そういや、えれながいつのまにか消えたな・・・
最多真鯛の宿題か…
えれなや怜って演じてる奴何回くらい変わってんだろ?
>962
呼んだ?
#include<stdio.h>
void main(void)
{
int a;
a = 10;
}
上のプログラムを実行すると「aの値は10です」と
出力するようにするにはどうしたら良いのでしょうか?
(%dを使って)
>>970 %dとまでいってて、何がわからないの?
もしかして全角でってこと?
972 :
デフォルトの名無しさん:02/05/07 22:50
その前にニホンゴができてないな。
母国語なんだろうけどいいたいことを正確に伝えられない
言語障害者はプログラミング言語をつかっても駄目なこと多いよ。
簡単なアルゴリズムを教えてください。
問題は
「キーボードから文字列を読み込んで,
読み込んだ文字列を逆にした文字列を表示する」解答 I94==>49I
という問題なのですが。。配列でやったのですが。。。
>>973 スタック使え...。多分これだけでは、ちんぷんかんぷんだろうから、
スタックを配列で作れ。とまでは言っておこう。
配列でやったならあとは一文字ずつ...
>>971 自分、超初心者なんで%dも良く分からないです。
全角でとは、どういう事ですか?
文字を入力してカウントするプログラムで
main()
{
int i=0,j;
while(j=getchar()){
if(j==EOF)break;
i++;
}
printf("文字数は%dです。\n",i);
}
と記述したのですが、
どうしても文字数+1となります。
なぜでしょうか?
973ですが、スタックってキューとかって
実際今まで使ったことがないのでわかりません。
基本情報を勉強したときに障った程度です。
配列でいこうと思っているのですが。。。
printf("aの値は10です\n%d%c%c",a,0x08,0x08);
あってる?
getchar()
で開業コードもカウントされるからですかな。
と書いてみるテスト。
>>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
strlen
とか使えばいいのではないかしら。
>>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
>>986 それでいけました。ありがとです。ヽ( ´ー`)ノ
continueてのは初めて聞きましたよ。
>>973 #include <stdio.h>
rev_put(ch)
{
if (ch != '\n') {
rev_put(getchar());
putchar(ch);
}
}
main()
{
rev_put(getchar());
}
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
push al
ね。
なにがやりたいのかわからん
1000!!!!
1000!!!!
!
ほいしょ。
せん。
はいはい
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。