프로그래밍

C언어 포인터 햇갈리는거 질문좀

190719-1.png

 

 

문자열 길이 구하는 함수를 만드는게 목표임

궁금한게 7번줄부터임

 

20번째 줄에서 strlen(a)해서

strlen 함수에 배열 a의 주소를 인수로 넘겨줬고

7번째에 포인터니까 *str !=0 해서 0이 될때까지  count를 증가시켜서

문자열의 길이를 구하는게 아닌가?

 

왜 str[i] !=0 을 해야 프로그램이 작동되던데

*str !=0 은 작동이 안되는걸까?

 

배열의 주소를 받아왔으니

포인터여도 배열의 문법에 맞춰 해야되는거야??

23개의 댓글

*하면 문자열 시작메모리주소라 str0의 주소인거

0
2019.07.19

abc를 입력했으면 *str은 a가 되겠지 str은 a를 가리키고 있을테고

그니까 str++을 해서 sizeof(str)만큼의 다음 주소를 가리키면 됨

0

이거 전에 말해줬던거로 기억하는데

문자열 같은 배열의 변수명은 그 배열 첫번째 원소의 주소이기 때문에 *를 붙인건 배열 첫번째 원소의 값이 된다고

즉 if(*str != 0)을 하면 if(str[0]!=0)와 똑같은 표현이 됨.

때문에 계속 첫번째원소만 체크하게 되니 무한 루프에 빠져서 작동이 안되는 거

0
2019.07.19
@알파스트라이크

아.. 기억남

그래서 scanf함수는 str[]=0이될때까지 출력하는 함수라고 말해준거 기억함

0
@자바잡아

엥 그부분도 니가 잘못기억하고 있는거 같은데 애초 scanf는 입력함수야;;

0
2019.07.19
@알파스트라이크

ㅇㅇ scanf 입력함수

 

문자열 출력할때 배열의 첫 주소 받아서 배열이 0될때까지 출력하는거 아닌가?

그래서 *str = str[0] 인거고

0
@자바잡아

너무 간추려서 쓰니 원 내용이 왜곡된거라고 해야하나 ㅋㅋ

scanf나 printf에 사용하는 %s 포맷 지정자는 해당 위치에 전해지는 전달인자의 값을 배열의 주소로 인식하고 printf에서 %s는 사용되면 그 배열의 원소의 값이 0이 되는 위치까지 읽어서 출력하도록 지정해주는 거다 정도로 간추리는게 더 맞는 표현이 되겠네.

그리고 그건 *str이 str[0]인 이유는 아니지. 배열의 변수명이 첫번째 원소의 주소인건 C에서 배열과 포인터 자체의 특성인거지 입출력함수와 포맷지정자의 기능에 종속되는 사항은 아니지. 오히려 반대로 배열의 변수명이 첫번째 원소의 주소인 것을 %s란 포맷지정자가 그 특성을 이용하는거.

0
@자바잡아

댓글 다는 중에 없어졌길래 여기다 쓸게

비주얼 스튜디오는 중단점은 원하는 줄에 가서 F9를 누르면 중단점을 추가 가능해 다시 없앨 때는 한번 더 F9을 누르면 중단점을 해제가능하고 이런 중단점은 원하는 곳 여러곳에 추가 가능해.

솔루션 구성이 Debug인 상태에서(프로젝트 기본상태) Ctrl + F5가 아닌 F5로 실행하면 디버깅으로 실행되는데 F9로 중단점 추가한 부분을 만나기 전까지 내용이 실행이 돼.(당연히 시작은 main 함수 첫 부분이겠지?) 멈춘 중단점에서 그다음 단계(다음 중단점을 만날 때까지)로 진행하려면 F5를 추가로 눌러주면 되고 그렇게 한단계씩 진행됨.

이렇게 디버깅 모드로 실행하면 아래쪽에 조사식이란 창이 보일건데 거기 이름에 원하는 변수명을 넣으면 그 변수가 가진 값이 현재 시점(중단점 위치를 만나서 중지된 상태에서 중단점 안에 노란색 화살표 같은게 보일거야 거기가 현재 시점)에서 조사식에 넣은 변수의 값을 알 수 있어. 물론 &str이나 *str, str[4] 처럼 주소나 배열의 원소, 간접참조값 등의 개별적으로도 추적가능해.

게다가 함수안에서 사용한 지역변수명인 경우 그 변수가 유효수명 내인지도 확인 가능해 예를 들어 변수 a가 해당 시점에서 이미 사라지고 없으면 오류: "a" 기호를 찾을 수 없습니다. 이런 식으로.

*a 같은 것도 a가 포인터 주소가 아니면 오류: 연산자와 호환될 수 없는 형식입니다라고 뜨고

a+b 처럼 연산식도 조사가능함.

 

디버깅 기능은 막강하니 활용하면 좋아.

0
2019.07.19
@알파스트라이크

진짜 고마워 매번

 

그리고 디버깅할때

printf 로 해서 확인하는 경우가 많을까

아님 굳이

printf로 할 필요가 없나??

 

반복문 같은 경우에는 뭐가 잘못됐는지

도중에 prinf안넣고 확인하는 방법은 없어?

prinf로 넣어서 값을 일일히 확인해 봐야되나?

 

근데 요즘은 printf로 확인 잘 안한다하길래

따로 방법이 있나 궁금함

0
@메이플스토리

그것도 F9 중단점이랑 F5로 디버깅 실행해서 조사식으로 확인하면 돼. 루프문이나 루프문 안에 중단점 있는 경우 루프회수만큼 중단점에서 멈추거든.

for(int i = 0; i < 10; i++) { a += b+i;} 같은게 있다고 했을 때 i, a, b, b+i 같은 것들 다 조사식에서 확인 가능해

심지어 i < 10이 true인지 false인지 확인도 할 수 있어.

 

printf로 중간중간 값 확인하는건 간단한 구조라서 그냥 즉석에서 확인해도 별 차이 없는 경우나 디버깅을 제대로 배우기 전에 간단한 방법이니 하는거고 내용이 많아지면 디버깅 모드 이용하는게 무조건 편리해.

0
2019.07.19
@알파스트라이크

그렇네 일단 디버그부터 배우고

 

뭐를 하든가 해야지

 

디버깅을 모르니 시간을 엄청 잡아먹네

 

알려줘서 고마워

0
@메이플스토리

사실 지금 네 단계에선 printf로 확인해도 별 문제는 없긴하고

디버그로 실행하는 것도 간단하게 원하는 값인지만 확인하는 거라 복잡하지도 않으니

F9로 중단점 찍고 F5로 실행해서 조사식에 궁금한 변수값을 확인해 본다 정도로만 활용할 줄 알면 지금은 충분해.

디버깅의 핵심은 네가 의도한 것이 제대로 의도대로 짜여졌는지 확인하는 용도고 그러기 위한 도구고 중요한 건 그 의도대로 만드는 능력을 갖추는 거야.

 

지금은 기초 개념을 확실히 네 것으로 하는게 급선무임. 비슷한 질문이 올라온다는 건 아직 그러한 기초가 탄탄하지 않아서니까.

교재의 코드와 문제는 개념을 익힌후 실제 확인하는 용도고 진짜 중요한건 교재에서 말로 설명된 개념부분이니 그런걸 놓치지 않게 확실히 자기걸로 만들어야 할거야. 열심히해

0
2019.07.19

while의 안쪽도 비교문이라 if를 안쓰고 하는게 더 편해

 

int strlen(char* str)

{

int result = 0;

while(*str++) result++;

return result;

}

 

이렇겡

0
2019.07.19

우리 친구는 디버깅을 하는 방법을 좀 배워야 할 거 같아.

 

이거는 최소한 *str을 비교하기 전에 *str을 출력만 해 봤어도 알 수 있는건데...

 

디버거를 이용하는 거창한(것도 사실 아니지만)일 말고도

단순히 printf로 찍어보는 것 만으로도 뭐가 잘못되고 있는지 확인이 가능한데...

1
2019.07.19
[삭제 되었습니다]
2019.07.19
@돈없는공대생
[삭제 되었습니다]
2019.07.19
@돈없는공대생
[삭제 되었습니다]
2019.07.19
@돈없는공대생

포인터는 따로 공부할려고 일단 전체적으로 다 끝내면

0
2019.07.19
@자바잡아
[삭제 되었습니다]
2019.07.19
@돈없는공대생

와.. 고마워

0
2019.07.19

에휴

0
2019.07.20

gdb 배워봐

0
2019.07.20

디버깅을 배운다라...

 

디버그란 이름 때문에 뭔가 어렵게 느껴지나본데, 디버그는 debug,

쉽게 말하면 그냥 버그 잡는거야. 디버깅은 그냥 ing 붙은거고.

 

디버깅을 한다는 거는, 너가 구현한 코드를 검토하면서,

어떤 코드에서 너가 생각했던 동작과 다르게 돌아가는지를 확인하고, 수정하는 작업이야.

 

너가 질문했던 코드를 보자.

"왜 str[i] !=0 을 해야 프로그램이 작동되던데 *str !=0 은 작동이 안되는걸까?"

 

이것도 다시 한번 이야기 하고 싶은게, 질문을 받은 사람은 "뭐 어떻게 작동이 안되는데?" 라고 물어볼 수 있어.

답변하는 사람이 몰라서 물어보는게 아니라, 너가 정말로 문제가 뭔지 아는지 확인차 물어보는거야.

그래서 이거는 어떻게 작동이 안되는지 명확하게 적어야해. 이건 전에도 해준 이야기야.

그냥 "--가 작동이 안돼!" 라는 말은 절대 쓰지마. 이건 답변해주는 사람에게 굉장한 실례야.

프로그램이 죽는다(크래시), 프로그램이 계속 멈춰있다(프리징), 내가 생각한 값은 x인데 y가 나온다

이런식으로 구체적으로 문제를 너가 명시를 해 줘야 해.

 

지금은 str[i] != 0을 *str != 0으로 바꿨을 때 문제가 발생한다는 것을 알고 있으니 그 쪽만 보면 되겠지.

만약 어디서 문제가 발생하는지 모르겠다? 그럼 프로그램의 처음부터 끝까지 살펴 봐야지.

그러면서 점점 범위를 좁히면서 정확히 어디가 문제인지 찾아내는 거고.

 

위의 코드대로라면 증상은 strlen의 값이 출력이 되지 않고 있을테니, 프로그램이 멈춰 있다는 증상으로 보면 되겠지.

그럼 왜 프로그램이 멈춰있을까? 를 생각해야해.

프로그램이 멈춰있을만한 이유는 뭐가 있을까?

마침 str[i] != 0 이 쪽은 루프를 탈출하는 조건과 아주 밀접한 연관이 있지.

 

그러면 루프를 왜 탈출하지 못할까?

루프를 탈출하려면 *str은 0, 즉 널문자를 만나야 해. 이게 지금 너의 코드의 유일한 조건이지.

그러면 *str 값이 어떤지 확인해보고 싶지 않아? 정말로 *str의 값이 계속 널 문자가 안나오는지?

 

그럴 때 strlen의 int i=0 밑에 이걸 하나 찍어보고 프로그램을 돌려보는거야.

printf("%d\n", *str);

그러면 매 루프마다 *str의 값이 어떻게 변하는지 확인할 수 있겠지.

그리고 지금같은 경우라면 계속 똑같은 문자가 나오겠지?

"어? 계속 똑같은 문자가 나오네? 왜 안변하지? 내가 str을 변화시켜 준 적이 없나?"

이런 식으로 사고가 흘러가야 해.

그리고 루프에서 조건을 변화시키는 걸 깜박한 걸 깨닫고 str포인터에 변화를 주도록 수정하면 끝이지.

 

이게 디버깅이야. 진짜 별거 없어. 그저 너의 로직을 점검하는 것 뿐이지.

위와 같이 프로그램이 실행되는 과정을 사람이 볼 수 있도록 출력하는걸 로깅(log-ing)한다고 해.

 

그런데 여기서 디버거(debugger)라는 툴을 사용한다?

그러면 굳이 printf나 다른 출력 함수를 쓸 필요도 없이, 디버거가 너가 확인하고 싶은 값을 직접 보여줘.

심지어는 코드 한줄한줄씩 실행시켜서 느긋하게 확인할 수 있도록 해 주는 강력한 툴이야.

윗친구가 좋은 링크를 첨부해줬으니, 차근차근 읽어봐.

 

앞으로는 질문하기 전에, 자기 힘으로도 한 번 해결해 보려고 노력해봐.

질문하는게 나쁜건 절대로 아니야. 질문할 줄 모르는 것도 좋지 않지.

다만, 남이 알려준 답변만 받아먹는 것 만으로는 너의 실력을 올릴 수 없어. 스스로 생각할 수 있어야 해.

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5677 [프로그래밍] Exiftool 이거 일본어 못 읽는데 12 부터시작하는이세... 0 14 시간 전 139
5676 [프로그래밍] 반응형 웹페이지가 내가상상한거랑 좀 다르네 3 평택국 0 1 일 전 328
5675 [프로그래밍] 고졸 FE개발자 연봉, 상황에 조언좀.. 15 쾅꿍꿍 0 1 일 전 431
5674 [프로그래밍] 물경력들 보면 책임을 이해못하는것같음 5 mils 1 2 일 전 271
5673 [프로그래밍] GPT가 코딩 다해주네 3 겜신병자 0 3 일 전 613
5672 [프로그래밍] 크로스플랫폼의 욕심은 끝이없다 4 ye 0 5 일 전 341
5671 [프로그래밍] 월루중에 백준 풀어보고 있는데, 6 오뜨 0 6 일 전 612
5670 [프로그래밍] 같이 일했던 시니어급 개발자 아예 직무 바꿨네.. 15 흐린눈 2 8 일 전 611
5669 [프로그래밍] 안드로이드 스튜디오가 이상해요... 2 집에가게해줘 0 9 일 전 374
5668 [프로그래밍] 양심고백 5 너가전부옳아 0 10 일 전 355
5667 [프로그래밍] 멀티겜만드는거 첨인데 빡시네 4 아님나 0 10 일 전 405
5666 [프로그래밍] vscode에 이런 설정도 있나? 17 너가전부옳아 0 11 일 전 267
5665 [프로그래밍] 네트워크 관련 관련 질문드립니다 6 그러네요 0 12 일 전 197
5664 [프로그래밍] 언리얼 C++이라고 불리는 이유? 4 nyvux 0 13 일 전 317
5663 [프로그래밍] 코틀린과 swing 기능 관련 다시 질문 4 집에가게해줘 0 13 일 전 150
5662 [프로그래밍] 22대 총선 정보를 모아 볼 수 있는 사이트 2 마포구알짜땅주인 0 14 일 전 302
5661 [프로그래밍] 집에서 공부하는 개붕이 있냐 8 년차html개발자 0 15 일 전 467
5660 [프로그래밍] Mojo 써본사람 있음? 5 너가전부옳아 1 16 일 전 339
5659 [프로그래밍] 코린이 swing 질문좀... 1 집에가게해줘 0 16 일 전 149
5658 [프로그래밍] 파이썬 pillow-avif-plugin 라이브러리 gif->avif 변환 관... 3 부터시작하는이세... 0 16 일 전 121