내 프로그램에서 사용자 입력을 받아서 2 차원 char 배열로 파싱 중입니다. 배열로 선언 :execvp()를 사용하여 기본 셸 빌드하기
char parsedText[10][255] = {{""},{""},{""},{""},{""},
{""},{""},{""},{""},{""}};
나는 사용자 입력을 잡아는 fgets를 사용하고 sscanf를 함께 분석하고있다. 이것은 내가 생각하는대로 모두 작동합니다.
execvp에 parsedText를 전달하려면 parsedText [0]에 경로가 있어야하고 인수가 제공되면 parsedText [1]에서 parsedText [10]에 있어야합니다.
execvp (parsedText [0], parsedText [1])의 문제점은 무엇입니까?
아마도 언급 할 가치가있는 한 가지는 아마도 "ls"와 같은 명령을 아무런 인수없이 제공하면 잘 작동하는 것입니다.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "308shell.h"
int main(int argc, char *argv[])
{
char prompt[40] = "308sh";
char text[40] = "";
char parsedText[10][40] = {{""},{""},{""},{""},{""},
{""},{""},{""},{""},{""}};
// Check for arguments to change the prompt.
if(argc >= 3){
if(!(strcmp(argv[1], "-p"))){
strcpy(prompt, argv[2]);
}
}
strcat(prompt, "> ");
while(1){
// Display the prompt.
fputs(prompt, stdout);
fflush(stdout);
// Grab user input and parse it into parsedText.
mygetline(text, sizeof text);
parseInput(text, parsedText);
// Check if the user wants to exit.
if(!(strcmp(parsedText[0], "exit"))){
break;
}
execvp(parsedText[0], parsedText[1]);
printf("%s\n%s\n", parsedText[0], parsedText[1]);
}
return 0;
}
char *mygetline(char *line, int size)
{
if (fgets(line, size, stdin))
{
char *newline = strchr(line, '\n'); /* check for trailing '\n' */
if (newline)
{
*newline = '\0'; /* overwrite the '\n' with a terminating null */
}
}
return line;
}
char *parseInput(char *text, char parsedText[][40]){
char *ptr = text;
char field [ 40 ];
int n;
int count = 0;
while (*ptr != '\0') {
int items_read = sscanf(ptr, "%s%n", field, &n);
strcpy(parsedText[count++], field);
field[0]='\0';
if (items_read == 1)
ptr += n; /* advance the pointer by the number of characters read */
if (*ptr != ' ') {
strcpy(parsedText[count], field);
break; /* didn't find an expected delimiter, done? */
}
++ptr; /* skip the delimiter */
}
}
나는 아직도 조금 혼란 스럽다 (char **). 정확히 어떻게 이러한 char 배열을 올바르게 정의하려고합니까? 또한 숙제이기 때문에 간단한 예제만으로도 충분합니다. 내 숙제를 끄지 않으려 고. – tgai