쉘 구현중에 질문입니다..

svsummon의 이미지

안녕하세요 이번에 공부를 하면서 쉘 구현을 공부하고 있는 학생입니다..

지금 쉘구현을 하면서 일단 입력 값으로 들어온 문장을 파싱하는 부분인데요..

알고리즘은 그 문장에서 연산자들의 수를 세고 그 연산자의 수 +1 만큼을 2차원 동적배열로 잡으려고 합니다.

만약 as > qwe | zxcv

이런 식으로 입력 값이 들어오면

commandp[0] = "as"
commandp[1] = "qwe"
commandp[2] = "zxcv"

이런 식으로 넣으려고 합니다

이렇게 하려면 입력 값에 따라 각 동적 배열이 서로 다른 크기를 가져야만 합니다.

그리고 연산자는 따로 oper 라는 1차원 동적 배열을 만들어서 각각 개인의 식별 값을 가지게 하는 코드입니다.

----

여기서 문제는 commandp 를 채우는 과정인데요

일단 for 문이 돌기전에 2차배열의 틀은 만들고

for 문 안에서 그 2차배열 안의 각 배열에 서로 다른 크기의 배열을 동적 배열 시킵니다.

(말이 되게 어렵네요 =_=;;)

지금 이런 식으로 했더니

거의 마지막 에 있는

-----

for(j=0; j < oper_count; j++)
*(*(commandp+j)) = 45;

-----

이부분에서 에러가 나더군요;;

지금 제가 하는 것에서 뭐가 문제인지 정확히 모르겟습니다;;

도움 부탁드립니다 ㅠㅠ

#include "mysh.h"
 
void fill_comp()
{
        int oper_count = 0;
	int j, k;
	int l = 0; // commandp 를 위한 식별자
	int tmp = 0; // 연산자의 위치를 갱신
 
	for(j=0; command[j] != '\0';j++)
	// malloc 을 해주기 위해 연산자의 개수를 센다
	{
		if(command[j] == '|' || command[j] == '>')
			oper_count++;
		if(command[j] == '<')
		{
			oper_count++;
			if(command[j+1] == '<')
				oper_count--;
		}
	}
 
	oper = malloc(oper_count); // 연산자의 개수만큼 동적 할당
	commandp = (char**)malloc(sizeof(char*) * (oper_count+1));
 
	for(j=0, k=0; command[j] != '\0'; j++)
	// 동적 할당한 oper 에 적절한 식별값을 채움
	// 1:< 2:<< 3:| 4:>
	// 동시에 commandp 의 동적 할당을 함
	{
		if(command[j] == '<')
		{
			oper[k] = 1;
			commandp[l] = (char*)malloc(sizeof(char) * (j-tmp));
			printf("< : j = %d, tmp = %d\n", j, tmp);
			l++;
			tmp = j+1;
			if(command[j+1] == '<')
			{
				oper[k] = 2;
				tmp = j+2;
			}
			k++;
		}
		else if(command[j] == '|')
		{
			commandp[l] = (char*)malloc(sizeof(char) * (j-tmp));
			printf("| : j = %d, tmp = %d\n", j, tmp);
			l++;
			tmp = j+1;
			oper[k] = 3;
			k++;
		}
		else if(command[j] == '>')
		{
			commandp[l] = (char*)malloc(sizeof(char) * (j-tmp));
			printf("> : j = %d, tmp = %d\n", j, tmp);
			l++;
			tmp = j+1;
			oper[k] = 4;
			k++;
		}
	}
	//for(k=0; k < oper_count;k++)
	//	printf("oper[%d] : %d\n", k, oper[k]);
 
	//commandp[0][0] = 'a';
	for(j=0; j < oper_count; j++)
		*(*(commandp+j)) = 45;
//	printf("sizeof commandp : %d\n", sizeof(commandp));
//	printf("oper_count : %d\n", oper_count);
	for(j=0; j < oper_count+5; j++)
		printf("sizeof commandp[%d] : %s\n", j, commandp[j]);
}
svsummon의 이미지

혹시 말이 어렵거나 해서 이해가 힘드시면 댓글달아주세요;; 최대한 다시 풀어서 말씀드릴게요 ㅠㅠ