[질문] 배열 공부중에... 너무너무 안풀려서 질문드립니다.

eomht의 이미지

안녕하세요.

배열 공부중인데... 처음에는 도움받는것 보다 풀어보는게 낫다고 생각하여 끙끙대다가... 이 문제 가지고 3일간 도전하다 안되서 글을 남깁니다.

ㅠ_ㅠ

void main()
{
	FILE * fin;
	char HHH[30];
	char * AAA[30];

	fin=fopen("read.dat", "r");

	for( int i=0 ; fgets(HHH, 30, fin) ; i++)
	{
		AAA[i]=HHH;		
		printf("Number %d : %s", i+1, AAA[i]);
		if ( i == 1 ) printf("for문 내에서 조사된 AAA[0] : %s",  AAA[0]);
		if ( i == 2 ) printf("for문 내에서 조사된 AAA[1] : %s",  AAA[1]);
	}

	fclose(fin);
}


read.dat 에 있는 파일내용.


가나다라마
하하하하하
파파파파파

자 결과는...

Number 1 : 가나다라마
Number 2 : 하하하하하
for문 내에서 조사된 AAA[0] : 하하하하하
Number 3 : 파파파파파
for문 내에서 조사된 AAA[1] : 파파파파파

이렇게 나옵니다.

제가 어떤 식으로 만들었나면은, 파일내에 있는 저 문자열

가나다라마
하하하하하
파파파파파

을 각각 AAA[0] = 가나다라마, AAA[1] = 하하하하하, AAA[2] = 파파파파파 를 넣으려고 하였습니다.

그런데 저렇게 만든 후에는 AAA[0 부터 2] 모두다 파파파파파 가 들어갑니다.

어떻게 하면 각각 제대로 넣을수가 있습니까?

아 그리고 AAA[i]=HHH; 대신 strcmp(AAA[i], HHH) 이건 왜 안되는지... 도 궁금합니다.

많은... 도움 부탁드리겠습니다. ㅠ_ㅠ

xster의 이미지

HHH에 값을 읽고 AAA의 각 원소에 모두 HHH의 포인터를 넣으셨으니 모두 똑같은 값을 가지고 되겠지요.
위와같은 형태를 원하신다면 char AAA[30][30] 으로 하시는 게 맞을 것 같습니다.

eomht의 이미지

xster wrote:
HHH에 값을 읽고 AAA의 각 원소에 모두 HHH의 포인터를 넣으셨으니 모두 똑같은 값을 가지고 되겠지요.
위와같은 형태를 원하신다면 char AAA[30][30] 으로 하시는 게 맞을 것 같습니다.

죄송합니다만 제 돌머리로는 이해가 되지 않습니다. ㅠ_ㅠ
AAA[0]=HHH 이런식으로 직접줘서, HHH의 포인터가 바뀔때(???) 마다 다른 원소에 연결한건데, 똑같은 값이 들어가게 되나요? ㅠㅠ

 
남에게 이길 수 있다고 생각하는 것은 자만이지만,
노력해서 이길 수 있다고 생각하는 것은 야망이다.
_____________________________

cronex의 이미지

음 일단 배열과 포인터에 대해서 다시 공부하시는게 좋을 거 같네요.
코드를 보면 배열과 포인터에 대해서 잘 이해하고 계시다고 생각되지 않는군요.

   char HHH[30];
   char * AAA[30];

에서 HHH는 30개의 char를 저장할 수 있는 배열입니다.
AAA는 30개의 char 포인터를 저장할 수 있는 배열입니다.
즉 포인터 값에 대한 배열은 만드셨지만 실제 그 포인터에 연결될 char배열은 하나만 선언하신것입니다.
위에 xter님이 설명하신대로 AAA[30][30]으로 선언하셔야 원하시는 결과를 얻으실 겁니다.

메모리 상에서 보면

HHH : +----+----+----+----+----+----+
      0                            30
AAA : +----+----+----+----+----+----+
      0                            30
      H
      H
      H

형태로 연결되어 있는 상태입니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

eomht의 이미지

cronex wrote:
음 일단 배열과 포인터에 대해서 다시 공부하시는게 좋을 거 같네요.
코드를 보면 배열과 포인터에 대해서 잘 이해하고 계시다고 생각되지 않는군요.
   char HHH[30];
   char * AAA[30];

에서 HHH는 30개의 char를 저장할 수 있는 배열입니다.
AAA는 30개의 char 포인터를 저장할 수 있는 배열입니다.
즉 포인터 값에 대한 배열은 만드셨지만 실제 그 포인터에 연결될 char배열은 하나만 선언하신것입니다.
위에 xter님이 설명하신대로 AAA[30][30]으로 선언하셔야 원하시는 결과를 얻으실 겁니다.

메모리 상에서 보면

HHH : +----+----+----+----+----+----+
      0                            30
AAA : +----+----+----+----+----+----+
      0                            30
      H
      H
      H

형태로 연결되어 있는 상태입니다.

감사합니다 ㅠ_ㅠ 아주 기초적인 생각을 못한것 같습니다... ㅠ_ㅠ

예전엔 이럴때면... 괜찮아. 군대 다녀오면 원래 돌머리 되는거야. 라고 넘기지만... 생각해 보면 벌써 제대한지 1년이 넘었다는...(꽥 ㅠ_ㅠ)

그냥 자만하지 말구 포인터랑 배열 관계부터 다시 책장을 넘겨야 되겠습니다 ^_^; 간단한 정리도 안하고 무작정 만들려고 했다니 ㅠ_ㅠ(도전정신? ^^)

 
남에게 이길 수 있다고 생각하는 것은 자만이지만,
노력해서 이길 수 있다고 생각하는 것은 야망이다.
_____________________________

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.