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

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의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.