C언어 고수분들 오류해결 부탁드립니다

#include <stdio.h>

int main(void)
{
int val1;

    int p;
int i;
int j;

int count=1;
int stack=1;	

printf(&quot;출력하고자 하는 소수의 개수:&quot;);
scanf(&quot;%d&quot; , &amp;val1);

for(i=2; count&lt;=val1; i++)
{
	for(j=1; j&lt;=i; j++)
	{
		p = i%j;
		if(p==0)
		{
			stack++;
		}
	}
	
	if(stack==2)
	{
		printf(&quot;%d&quot; , i);
		count++;
	}
	stack=1;
}

return 0;

}

소수를 출력시켜주는 단순한 프로그램입니다.
컴파일상 오류는 발견되지 않았습니다.
그런데, '출력하고자 하는 소수의 개수: ’ 가 터미널에 출력되고 특정값을 입력하고 엔터를 치는 순간 프로그램이 멈춰버립니다.(종료되지가 않습니다. ctrl + c를 누르니 터미널로 다시 빠져 나오더군요) -> 무한루프에 빠질 조건도 딱히 없는것 같은데…
혹시나 해서 윈도우7(사용컴파일러: dev c++)에서 컴파일 해봐도 동일한 현상이 나타났습니다.
소스어딘가에 문제가 있나본대 못찾겠습니다.
2틀동안 해매고 있내요… :cry: :cry:
PS).분명 개시글을 작성할때는 들여쓰기가 되어있었는대 저장하니 들여쓰기가 되있지 않군요;;
텝키가 말을 듣지않내요;; 들여쓰기 안되있는점 죄송합니다.

[code:kyilu8uv]
#include <stdio.h>

int main(int argc, char *argv[])
{
int val1;

int p;
int i;
int j;

int stack = 0;

printf(&quot;출력하고자 하는 소수의 개수&#58; &quot;);
scanf(&quot;%d&quot;, &amp;val1);

for (i = 2; i &lt;= val1; i++) {
	for (j = 1; j &lt;= i; j++) {
		p = i % j;
		if (p == 0) {
			printf(&quot;%d = %d %% %d\n&quot;, p, i, j);
			stack++;
		}
	}
	printf(&quot;stack = %d\n&quot;, stack);

	if (stack == 2) {
		printf(&quot;Prime number&#58; %d\n&quot; , i);
	}
	printf(&quot;\n&quot;);
	stack = 0;
}

return 0;

}
[/code:kyilu8uv]

본인이 작성한 코드는 무한루프가 돌게 되어 있습니다.
프로그램이 어떻게 동작하고 있는지 잘모를때에는 위에 처럼 각 변수 값을 직접 확인해보는게 제일 쉽습니다.

소수를 어떤 방법으로 구하는것에 관한 정보도 없고 잘 모르는 관계로 간단하게 count++ 위치만 조건문 밖으로 빼서 무한루프가 돌지만 않도록
수정해봤지만 그냥 참고용으로 보시고 무엇을 구현할지는 본인이 제일 잘아실테니, 본인코드가 왜 무한루프인지 파악하는데 참고해보세요.

.P.S 소수가 뭔지 찾아보니 별꺼 아니군요. 코드 확인해보세요.

[code:1vtbh3as]#include <stdio.h>
#include <stdlib.h>
#Trial division : 단순반복 나눗셈으로 소수 구하기
int main(int argc, char *argv[]) {
int p, i, j, count = 1;
//var1에 미리 값을 지정하는 대신 commandline에서 인자를 넘겨받아 사용.
printf("출력하고자 하는 소수는 %s개이고, 소수는 ", argv[1]);
//소수의 개수가 인자의 값일때 까지 반복
for(i = 2; count <= atoi(argv[1]); i++) {
//소수를 판정
for(j = 2; j <= i; j++) { //소수는 1이
p = i % j;
//나머지 값이 0인 경우
if(p == 0)
break; //소수가 맞으면, 현재 주어진 값의 소수 판정을 중단
}
//소수면 출력.
if(j == i){
printf("%d, ", i);
//소수가 출력된 횟수를 1증가
count++;
}
}
printf("이다.\n");
return 0;
}[/code:1vtbh3as]
숙제인가요?

"stack==2"인 경우가 있나요?

stack=1;
for (…) {

stack++;

}
if(stack==2) {

}
stack=1;

이런 형태인데요, 결론적으로 말하자면, stack==2 대신 stack==3으로 변경하셔야 합니다.

왜냐면, stack++에 의해 항상 stack의 값이 하나 더 증가 하기 때문이죠.
stack 여기서 약수의 갯수를 의미하고, 약수가 두개 이하이면, 소수로 판단하는 것인데…

첨에 stack=1이고, 1로 나눈 나머지가 0이기 때문에 2가 되고, 자신에 의해 나눈 나머지가 0이기 때문에 3이 됩니다.
그래서 2가 아니라 3이 되어서 2가 되는 경우가 없고, 소수의 갯수인 count값이 증가되지 않기 때문에 무한루프에 빠지는 것입니다.

그렇지만 stack==3으로 변경하는 것보다는 stack의 초기값을 0으로 변경하고,
비교문을 stack==2로 사용하는게 훨씬 직관적입니다.
그렇게 하시려면, 맨처음의 int stack=1; 대신 int stack=0;으로
루프문에서 초기화하는 stack=1;문장을 stack=0;으로 변경하시면 됩니다.

그리고 코드를 올리실 때에는, 블럭을 선택하신 후, 글입력창 윗쪽의 Code버튼을 눌러주시면, 코드로 인식해 들여쓰기가 됩니다.

stack 값을 0으로 초기화 하면서 문제를 해결하였습니다.
지적해주신 부분과 수정해서 올려주신 코드를 조금 변형해서 성공적으로 컴파일하고 프로그램을 돌리는대 성공하였습니다.
지적사항과 개선방향을 가르쳐주셔서 감사하다는 말씀 먼저 드리겠습니다.

[quote="DH.Choi":3k7xkpgu]"stack==2"인 경우가 있나요?[/quote:3k7xkpgu]

stack값을 0으로 초기화하면서 stack==2가 되도록 수정하였습니다.

[quote="별님":lc8grs91][code:lc8grs91]#include <stdio.h>
#include <stdlib.h>
#Trial division : 단순반복 나눗셈으로 소수 구하기
int main(int argc, char *argv[]) {
int p, i, j, count = 1;
//var1에 미리 값을 지정하는 대신 commandline에서 인자를 넘겨받아 사용.
printf("출력하고자 하는 소수는 %s개이고, 소수는 ", argv[1]);
//소수의 개수가 인자의 값일때 까지 반복
for(i = 2; count <= atoi(argv[1]); i++) {
//소수를 판정
for(j = 2; j <= i; j++) { //소수는 1이
p = i % j;
//나머지 값이 0인 경우
if(p == 0)
break; //소수가 맞으면, 현재 주어진 값의 소수 판정을 중단
}
//소수면 출력.
if(j == i){
printf("%d, ", i);
//소수가 출력된 횟수를 1증가
count++;
}
}
printf("이다.\n");
return 0;
}[/code:lc8grs91]
숙제인가요?[/quote:lc8grs91]

숙제는 아니구요.
아직 고등학생 이여서 C언어를 전문적으로 배우지는 못했습니다.
이쪽분야에 관심이 많아 이것저것 독학하면서 하나하나 습득해 나가고 있습니다.
좀더 배우다 보면 저도 댓글을 써주신 별님 처럼 능숙하게 C언어를 다루는 날이 오겠죠(?). :D

[quote="protochaos":39jvu1iy]stack=1;
for (…) {

stack++;

}
if(stack==2) {

}
stack=1;

이런 형태인데요, 결론적으로 말하자면, stack==2 대신 stack==3으로 변경하셔야 합니다.

왜냐면, stack++에 의해 항상 stack의 값이 하나 더 증가 하기 때문이죠.
stack 여기서 약수의 갯수를 의미하고, 약수가 두개 이하이면, 소수로 판단하는 것인데…

첨에 stack=1이고, 1로 나눈 나머지가 0이기 때문에 2가 되고, 자신에 의해 나눈 나머지가 0이기 때문에 3이 됩니다.
그래서 2가 아니라 3이 되어서 2가 되는 경우가 없고, 소수의 갯수인 count값이 증가되지 않기 때문에 무한루프에 빠지는 것입니다.

그렇지만 stack==3으로 변경하는 것보다는 stack의 초기값을 0으로 변경하고,
비교문을 stack==2로 사용하는게 훨씬 직관적입니다.
그렇게 하시려면, 맨처음의 int stack=1; 대신 int stack=0;으로
루프문에서 초기화하는 stack=1;문장을 stack=0;으로 변경하시면 됩니다.

그리고 코드를 올리실 때에는, 블럭을 선택하신 후, 글입력창 윗쪽의 Code버튼을 눌러주시면, 코드로 인식해 들여쓰기가 됩니다.[/quote:39jvu1iy]

stack값을 잘못 선언한것이 무한루프로 빠지게 한 원인이었습니다. 덕분에 오류를 해결하고 정상적으로 프로그램을 실행시키는대 성공했습니다.
감사합니다. :)

[quote="changmin811":3w0ak7uq][code:3w0ak7uq]
#include <stdio.h>

int main(int argc, char *argv[])
{
int val1;

int p;
int i;
int j;

int stack = 0;

printf(&quot;출력하고자 하는 소수의 개수&#58; &quot;);
scanf(&quot;%d&quot;, &amp;val1);

for (i = 2; i &lt;= val1; i++) {
	for (j = 1; j &lt;= i; j++) {
		p = i % j;
		if (p == 0) {
			printf(&quot;%d = %d %% %d\n&quot;, p, i, j);
			stack++;
		}
	}
	printf(&quot;stack = %d\n&quot;, stack);

	if (stack == 2) {
		printf(&quot;Prime number&#58; %d\n&quot; , i);
	}
	printf(&quot;\n&quot;);
	stack = 0;
}

return 0;

}
[/code:3w0ak7uq]

본인이 작성한 코드는 무한루프가 돌게 되어 있습니다.
프로그램이 어떻게 동작하고 있는지 잘모를때에는 위에 처럼 각 변수 값을 직접 확인해보는게 제일 쉽습니다.

소수를 어떤 방법으로 구하는것에 관한 정보도 없고 잘 모르는 관계로 간단하게 count++ 위치만 조건문 밖으로 빼서 무한루프가 돌지만 않도록
수정해봤지만 그냥 참고용으로 보시고 무엇을 구현할지는 본인이 제일 잘아실테니, 본인코드가 왜 무한루프인지 파악하는데 참고해보세요.

.P.S 소수가 뭔지 찾아보니 별꺼 아니군요. 코드 확인해보세요.[/quote:3w0ak7uq]

앞으로 복잡한 루프구문을 작성할때는 지적해주신 대로 변수값을 직접확인해 보는 습관을 기르도록 하겠습니다.(변수 값을 직접확인해서 무한루프를 찾을수 있었습니다. :D )

좋네요!
요즘엔 전공하는 사람 중 일부는 이런 류의 과제를 사람 시켜서 하는 것이 참 보기 나빴는데…
그런 사람들에 비해서는 훨씬 바람직한 모습이라 생각합니다.

더불어서, 저도 스스로 아쉽게 생각하는 거지만…
코드를 생산하는 것보다 흐름을 만드는 게 중요합니다.
하지만 어딜 가나 먼저 가르쳐주는 게 코딩이니… ㅠㅠ

뭐, 어쨌든…
멋진 프로그래머가 되시길 빕니다. :)