배열의 값이 자동으로 변경되는 문제 발생

익명 사용자의 이미지

c_num에 값을 넣고, u_num에 입력을 받으면 c_num의 데이터 값들이 000으로 변경됩니다.
왜그러는 걸까요? 그리고 변경이 안되게 하려면 어떻게 해야하나요??

  7 #include <stdio.h>
  8 #include <stdlib.h>                                                                                                        
  9 
 10                                                                                                                            
 11 int user_input(char user_number[])                                                                                         
 12 {
 13         scanf("%d %d %d", &user_number[0], &user_number[1], &user_number[2]);                                              
 14         return 0;
 15 }       
 16         
 17 int main()
 18 {       
 19         char c_num[3] ;                                                                                           
 20         char u_num[3];
 21 //      c_num[0] = 1;
 22 //      c_num[1] = 2;
 23 //      c_num[2] = 3;
 24                 
 25         printf("%d\n",&c_num[0]);                                                                                          
 26         printf("%d\n",&c_num[1]);
 27         printf("%d\n",&c_num[2]);                                                                                          
 28         
 29         
 30 //사용자 입력
 31         user_input(u_num);                                                                                                 
 32                                                                                                                            
 33         printf("%d\n",&c_num[0]);                                                                                          
 34         printf("%d\n",&c_num[1]);                                                                                          
 35         printf("%d\n",&c_num[2]);                                                                                          
 36         return 0;
 37 }       
shint의 이미지

1. scanf() 함수에 용도. 인자값. 리턴값. 오류값을 네이버. 구글. MSDN. 책.등에서 확인해보세요.
%d 는 int 형을 입력받습니다. (4바이트) 64비트에서도 같습니다.
%c 는 char 형을 입력받습니다. (1바이트) 8bit = 0~255 = -128 ~ +127 의 범위를 가질겁니다.
http://dntkrl79.blog.me/220911725265
sizeof() 로 변수 크기를 확인하 실 수 있습니다.
32비트와 64비트의 다른점은 주소(Address)의 크기입니다.

%c로 입력 받으려면 1개의 문자를 입력 받을 수 있으므로. char배열의 크기를 문자열로 늘리거나.
%d로 숫자를 입력 받으셔야 합니다.
입력받은 숫자 데이터를 명시적 형변환 (char)을 사용해서 변환해 줍니다.
(char)를 사용하지 않는다면. 묵시적 형변환이 일어나게 됩니다.
데이터의 크기 만큼만. 변수에 할당되게 됩니다. 넘치는 값은 사라지게 됩니다.

각 변수에 주소와 값'을 모두 확인해 보시기 바랍니다.
Visual C++에서는 F9 F5 F10으로 확인이 가능합니다.

학원. 직업학교. 사이버 강의 OLC Centor. 책 동영상강의. 등에서도 배우실 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
 
 
int user_input(char user_number[])
{
	int num[3];
	scanf("%d %d %d", &num[0], &num[1], &num[2]);
	user_number[0] = (char)num[0];
	user_number[1] = (char)num[1];
	user_number[2] = (char)num[2];
	return 0;
}
 
int main()
{
	char c_num[3];
	char u_num[3];
 
	c_num[0] = 1;
	c_num[1] = 2;
	c_num[2] = 3;
 
	printf("%d\n", &c_num[0]);
	printf("%d\n", &c_num[1]);
	printf("%d\n", &c_num[2]);
 
	printf("%d\n", c_num[0]);
	printf("%d\n", c_num[1]);
	printf("%d\n", c_num[2]);
 
	//사용자 입력
	user_input(u_num);
 
	printf("%d\n", &c_num[0]);
	printf("%d\n", &c_num[1]);
	printf("%d\n", &c_num[2]);
 
	printf("%d\n", c_num[0]);
	printf("%d\n", c_num[1]);
	printf("%d\n", c_num[2]);
 
 
	printf("%d\n", &u_num[0]);
	printf("%d\n", &u_num[1]);
	printf("%d\n", &u_num[2]);
 
	printf("%d\n", u_num[0]);
	printf("%d\n", u_num[1]);
	printf("%d\n", u_num[2]);
	return 0;
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

라스코니의 이미지

scanf()는 연속된 데이터 입력을 받는데에는 적합하지 않습니다. 데이터를 입력하고 사용자가 CR(Carriage Return)를 넣게 되는데 그게 아직 입력 버퍼에 남아있기 때문입니다.

몇가지 해결책이 있는데 그중 생각나는 것만 적어보면

1) scanf(), fflush(STDIN)을 쓰기,, 즉 입력 받고 입력 버퍼를 비워버림. 하지만 VS에서만 사용가능하고 ANSI 표준이 아닌 단점이 있음

2) gets() 와 sscanf()을 섞어서 쓰기

3) getline() 과 sscanf()를 섞어서 쓰기 <-- C 언어라면 권장

4) cin 을 쓰기

댓글 달기

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