私は標準入力からコマンドラインを読み込んで、それをトークンに解析するはずの関数に渡すプログラムを書いた。なぜ私の解析関数がすべての予想されるトークンを返すのですか?
これは、解析関数である:これは私が私のプログラムへの供給入力の一例である
int main() {
int status;
pid_t pid;
pid = fork();
while(1) {
if(pid < 0) {
status = -1;
perror("Fork");
} else if(pid == 0) {
char* cmd;
printf("$");
if(fgets(cmd, sizeof cmd, stdin) == NULL) break;
parse_cmdline(cmd);
} else {
if(waitpid(pid, &status, 0) != pid) {
status = -1;
}
break;
}
}
return 0;
}
:
char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*));
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("flag1");
return arr;
}
そして、これは私がそれをmain()
を、それを使用しています方法です
ls l a
予想される出力は、
です。l
(つまり、私の解析機能により、印刷された第2引数である)
そして文字通り何も起こりません。 printf( "flag1")さえありません。印刷します。しかし、char ** commands
を削除してprintf("%s", commands[0]);
をparse_cmdline関数に入れると、返り値を代入しない以外はすべて動作します。なぜ、どのようにそれを修正するには?コマンドの
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*));
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("%s\n", arr[1]);
return arr;
}
最小限の完全で検証可能な例を投稿してください。 – EOF
さらに何が必要ですか? –
何かをファイルに貼り付けてコンパイルすることができます。また、コンパイルの結果をパイプで入力することもできます。おそらく出力私はプログラムの実行の出力を比較することができます。 – EOF