質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

1回答

1810閲覧

引数がついているcalコマンドを実装できるようにする

peroro

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/11/23 03:36

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード #include<unistd.h> #include<string.h> #include<ctype.h> #include<stdio.h> #include<sys/wait.h> int exec(char *cmd){ char *argv[16],work[256],*wp=work; int n=0; strcpy(wp, cmd); while(argv[n++]=strsep(&wp,""))!=NULL); return execvp(arg[0],argv); } int main(int argc, char *argv[]){ char line[126]; char cmd[256]; printf("cal"); while(fgets(line, 128, stdin)!=NULL){ line[strlen(line)-1]='¥0'; strcpy(cmd,line); if(fork()==0){ execlp("/usr/bin/cal"."/usr/bin/cal",exec(cmd),NULL); } wait(NULL); usleep(100*1000); printf("CAL"); } return 0; } ### 試したこと ### 補足情報(FW/ツールのバージョンなど) calコマンドを常に実行できるようにし、myexec関数を引数として様々な形でcalを実装しようとした

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/11/23 04:37

calコマンドとは一体何でしょうか。 あまりに説明不足すぎです また、このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

質問で、「ここに言語名を入力」を「C」で上書きしてください。
「ソースコード」を #include <unistd.h> から } までで上書きしてください。

exec の代わりに system ではダメなんですか?

C

1#include <stdio.h> // fgets, sprintf, printf 2#include <stdlib.h> // system 3 4int main(int argc, char *argv[]) 5{ 6 char line[128]; 7 char cmd[256]; 8 printf("cal "); 9 while (fgets(line, 128, stdin) != NULL) { 10 sprintf(cmd, "cal %s", line); 11 system(cmd); 12 printf("CAL "); 13 } 14 return 0; 15}

Ubuntu (Linux) での実行結果

text

1cal (Enter) 2 November 2020 3Su Mo Tu We Th Fr Sa 4 1 2 3 4 5 6 7 5 8 9 10 11 12 13 14 615 16 17 18 19 20 21 722 23 24 25 26 27 28 829 30 9 10CAL 12 2020 (Enter) 11 December 2020 12Su Mo Tu We Th Fr Sa 13 1 2 3 4 5 14 6 7 8 9 10 11 12 1513 14 15 16 17 18 19 1620 21 22 23 24 25 26 1727 28 29 30 31 18 19CAL 2020 (Enter) 20 2020 21 January February March 22Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 23 1 2 3 4 1 1 2 3 4 5 6 7 24 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14 2512 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21 2619 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28 2726 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31 28 29 30 April May June 31Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 32 1 2 3 4 1 2 1 2 3 4 5 6 33 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13 3412 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20 3519 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27 3626 27 28 29 30 24 25 26 27 28 29 30 28 29 30 37 31 38 39 July August September 40Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 41 1 2 3 4 1 1 2 3 4 5 42 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4312 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19 4419 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26 4526 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30 46 30 31 47 48 October November December 49Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 50 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 51 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12 5211 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19 5318 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26 5425 26 27 28 29 30 31 29 30 27 28 29 30 31 55 56CAL (Ctrl-D)

追記
system ではなく、fork と execvp で書いてみました。

C

1#include <stdio.h> // fgets, printf 2#include <string.h> // strtok 3#include <unistd.h> // execvp, fork 4#include <wait.h> // wait 5 6int main(void) 7{ 8 char line[128], *argv[32] = { "/usr/bin/cal" }; 9 printf("cal "); 10 while (fgets(line, sizeof line, stdin)) { 11 int i = 1; 12 argv[i] = strtok(line, " \t\n"); 13 while (i < 31 && argv[i]) argv[++i] = strtok(NULL, " \t\n"); 14 if (fork() == 0) execvp(argv[0], argv); 15 wait(NULL); 16 printf("CAL "); 17 } 18 return 0; 19}

投稿2020/11/23 06:03

編集2020/11/25 04:12
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peroro

2020/11/23 12:08

なるほどありがとうごさいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問