동적할당 배열의 출력결과 오류 문제(feat.난수)

sarah1326의 이미지

안녕하세요. 저는
1) 난수를 받아 그 숫자크기만큼의 배열을 만들고
2) 그 배열의 요소도 난수로 받은 다음
3) 요소들을 출력하고
4) 또 다른 난수 k를 받아서
5) k와 배열의 요소들을 비교하여
6) 요소들 중에는 k가 몇 개가 있는지 최종적으로 출력하는
..프로그램을 devc++로 만들었습니다.

예)
1) 난수 3을 받음.
2)3) 요소도 난수로 받아서 배열 13 3 2 이 생성됨. 이것을 출력함
4) 난수k인 2를 받음.
5)6) 비교 결과 배열의 요소에는 k값과 같은 2가 1개 있음.>> 1을 출력함.
===========
3
13 3 2
이 배열에서 "2(=k)"의 개수는 "1"이다.
===========


..그런데 여기에서 cmd창으로 결과를 보면 오류가 나서 질문드립니다. 어떻게 하면 고칠 수 있을까요? 컴파일 이상은 없습니다.

<문제가 된다고 의심되는 함수의 코드>

int num_count_func2(){
srand(time(NULL));
int count = 0;
int random2 = rand()%20+2; // 찾아야 하는 수 k. 2부터 21까지 가능하다. 
int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. 
int ary[random1];
for(int i=0; i<random1; i++){
if(ary[i]==random2){
count +=1;
};
}
printf("\n\n이 배열에서 \"%d\"의 개수는 \"%d\"이다.", random2,count);
}

<프로그램 전체 코드>

#include<stdio.h> //scanf, printf
#include<stdlib.h> // malloc, free
#include<time.h>
#include<windows.h> // delay 
 
int func1(); // 이 프로그램의 메인이 되는 함수 
int num_count_func2(); // 사용자가 값을 입력하면//
// 그 값과 일치하는 값이 몇개인지 알려주는 함수 //
 
int main(){
func1();
num_count_func2();
}
 
int func1(){
srand(time(NULL));
int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. 
int ary[random1];
for(int i=0; i<random1; i++){
ary[i] = rand()%19+2; // 2부터 20까지의 난수가 요소로 들어간다. 
}
printf("배열에 대입한 난수값\n");
printf("%d\n\n", random1);
for(int i=0; i<random1; i++){
printf("%d ", ary[i]);
}
 
return 0;
}
 
int num_count_func2(){
srand(time(NULL));
int count = 0;
int random2 = rand()%20+2; // 찾아야 하는 수 k. 2부터 21까지 가능하다. 
int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. 
int ary[random1];
for(int i=0; i<random1; i++){
if(ary[i]==random2){
count +=1;
};
}
printf("\n\n이 배열에서 \"%d\"의 개수는 \"%d\"이다.", random2,count);
}
File attachments: 
첨부파일 크기
Image icon cmd결과창입니다.18.88 KB
라스코니의 이미지

컴파일 된게 더 이상하네요. int ary[random1]와 같이 가변 길이로는 배열 선언 자체가 안되는데...
int *arr = malloc(random1*sizeof(int)) 이렇게 선언해야 되거든요.

Dev C++은 사용하지 마시고(정말 구닥다리 개발환경&컴파일러고 이제 버려야 할 때가 되었습니다) Visual Studio Code(https://code.visualstudio.com/)를 설치해서 해보세요. Windows 환경이라면 WSL2 개발 환경을 구축해서 하시는 걸 추천드립니다.

자 문제 해결은 ary[] 배열에 아무 값도 대입이 되고 있지 않아요. 먼저 ary[i] = rand()%20+2; 이렇게 배열에 비교할 값을 넣어놓는 단계가 먼저 있어야 하죠.

김정균의 이미지

C99 에서.. 배열 가변 길이가 지원될 겁니다. 빌드할 때 C99 옵션을 주었을지는 모르겠지만 ^^
음 DEV C++ 에서 C99 를 지원하지 않아서 빌드가 안될 거라고 하신걸지도 모르겠군요. DEV C++은 써 본적이 없어서..

라스코니의 이미지

아 C99 에서는 그런 것도 지원하는 군요???
이런 기능이 2001년도 부터 가능했네요 ㅠ.ㅠ

ymir의 이미지

func1() 과 num_count_funct2() 에 있는 int ary[random1]; 는 서로 다른 메모리 영역을 가진 지역 변수입니다. 즉, 둘 사이에는 아무런 연결 고리가 없습니다. 심지어 num_count_funct2() 에 있는 ary[] 에는 아무런 값도 넣지 않았을 뿐만 아니라, 어떤 값이 들어 있는지 확인해 보지도 않았기 때문에, 결과가 이상하다고 할 수 없습니다.

int ary[random1]; 과 int random1; 을 전역 변수로 빼고, random1 은 딱 한 번만 값을 설정해 보세요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

jick의 이미지

다른 부분은 다른 분들이 지적하셨고, 코드에 큰 악영향은 아마도 없습니다만(?) srand는 난수를 "초기화"하는 함수이기 때문에 매번 부르면 더 훌륭한 난수가 나오는 게 아니라 엉터리 난수가 나옵니다.

프로그램 시작할 때 메인에서 한 번만 불러주세요.

sarah1326의 이미지

이전에 이미 수정해서 완료했지만 여기 있는 조언들을 잘 참고하겠습니다.
그리고 devc++ 말고 visual studio code에 익숙해지겠습니다 ㅎㅎ

댓글 달기

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