C언어 질문입니다. 왜 안되는지 잘 모르겠습니다.

rhkdwls52의 이미지

#include
#include
typedef struct
{
char root;
char lnode;
char rnode;
}Node;

int main(){

int num;
scanf_s("%d", &num); // 노드의 갯수 입력

Node *node =(Node*)malloc(num*sizeof(Node));
for (int i = 0; i < num; i++) {
scanf_s(" %c %c %c", &node[i].root, &node[i].lnode, &node[i].rnode);
}
printf("\nd\n");
for (int j = 0; j < num; j++) {
printf("%c %c %c", node[j].root, node[j].lnode, node[j].rnode);
printf("\n");
}
free(node);
return 0;

}

와 같이 작성하였습니다.
입력
2
A B C
D E F

출력
---------------------
A B
D E

와 같이 하였습니다.

왜 마지막 값이 안 나오는지 모르겠습니다.

환경은 Windows 10이며, visual studio 2017 을 이용하였습니다.

답변주시면 감사하겠습니다.

rhkdwls52의 이미지

수정하였습니다.

 의 이미지

어떤 입력을 넣었고, 어떤 출력을 기대했고, 어떤 출력이 나왔기에 "이상한 값"이라고 하시는지요?

일단 코드만 보기에는 딱히 문제될 만한 부분이 없어 보입니다. 다만 프로그래머의 의도를 알기는 어렵군요.

rhkdwls52의 이미지

수정하였습니다. 의도는 단순히 구조체배열에 집어넣고 출력하는것입니다.

 의 이미지

아하, 제가 scanf_s에 대해 잘못 알고 있었군요.

"%c" format specifier를 사용할 때에도 size argument가 필요한 모양입니다.

https://msdn.microsoft.com/en-us/library/6ttkkkhh.aspx
https://msdn.microsoft.com/en-us/library/w40768et.aspx

아래와 같이 바꾸면 잘 돌겠군요. 행간에 d는 왜 들어가는지 모르겠습니다만 일단..

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
	char root;
	char lnode;
	char rnode;
}Node;
int main() {
 
	int num;
	scanf_s("%d", &num); // 노드의 갯수 입력
	Node *node = (Node*)malloc(num * sizeof(Node));
	for (int i = 0; i < num; i++) {
		scanf_s(" %c %c %c", &node[i].root, 1, &node[i].lnode, 1, &node[i].rnode, 1);
	}
	printf("\nd\n"); // d는 왜 들어가나요?
	for (int j = 0; j < num; j++) {
		printf("%c %c %c", node[j].root, node[j].lnode, node[j].rnode);
		printf("\n");
	}
	free(node);
	return 0;
}
rhkdwls52의 이미지

제가 어리석었습니다.

감사합니다.

라스코니의 이미지

디버그를 해 보시기 바랍니다. 디버그를 해서 root, lnode, rnode 에 각각 어떤 값이 들어가 있는지 확인해 보시기 바랍니다. 아마 어떤 곳에 CR (carrage return) 이 대신 들어가 있을 것입니다.
그것은 scanf() 함수와 얽힌 고질적인 문제점입니다.

디버그를 하면 충분히 어떤 문제인지 파악할 수 있는 경우입니다. 어떻게 해결하는지 모르시겠다면 그때 질문을 하시면 됩니다.

bushi의 이미지

원본 코드에 이미 방어가 되어 있습니다.

shint의 이미지

보통 윈도우에서는 키입력을 받을 때. 3가지를 자주 사용합니다.
- WINAPI - WndProc() - KeyDown()
- MFC - PreTranslateMessage()
- GetAsyncKeyState()

//프로젝트 속성 - 일반 - 문자집합
- char : 멀티바이트 문자집합 MBCS - scanf(), putchar(), EOF, printf()
- wchar_t : 유니코드 문자집합 UNICODE - wscanf(), putwchar(), WEOF, wprintf()
- TCHAR : 멀티바이트와 유니코드에서 혼용

//유니코드에서의 사용방법
wchar_t wc;
int result = wscanf_s(L"%hc %lc", &c, 2, &wc, 1);
wprintf(L"The number of fields input is %d\n", result);
wprintf(L"The contents are: %C %c\n", c, wc);
wscanf_s(L"%hc%hc%hc", &node[i].root, 2, &node[i].lnode, 2, &node[i].rnode, 2);
wprintf(L"The contents are: %C %C %C\n", &node[i].root, &node[i].lnode, &node[i].rnode);

//scanf_s()가 앞에 있어서. 엔터를 치면. 출력이 잘못되는 경우. 임시 해결 방법
#include < conio.h >
int num;
scanf_s("%d", &num);
putchar(getchar());
scanf_s(" %c%c%c", &node[i].root, 1, &node[i].lnode, 1, &node[i].rnode, 1);

//지역 언어 설정
#include /* struct lconv, setlocale, localeconv */
setlocale(LC_ALL, "korean");

스트림 상태
https://msdn.microsoft.com/ko-kr/library/kb1at4by.aspx

상태 다이어그램은 대부분의 쓰기 및 읽기 작업에서 위치 함수 중 하나를 호출해야만 한다는 것을 보여줍니다.
•스트림의 마지막 작업이 쓰기이면 읽기 함수를 호출할 수 없습니다.
•스트림의 마지막 작업이 읽기이며, 읽기 작업이 파일 끝 지표를 설정하지 않는다면, 쓰기 함수를 호출할 수 없습니다.

stdin, stdout, stderr
https://msdn.microsoft.com/ko-kr/library/3x292kth.aspx

putchar, putwchar
https://msdn.microsoft.com/ko-kr/library/48szs1c2.aspx

반환 값
--------------------------------------------------------------------------------
기록 된 문자를 반환 합니다.
오류 또는 파일 끝 조건을 나타내기 위해 putc 및 putchar 반환 EOF;
putwc and putwchar return WEOF. 모든&4; 개의 루틴에 대 한 사용 ferror
또는 feof 오류 또는 파일의 끝에 대 한 확인 합니다. Null 포인터에 전달 되 면 stream,
이러한 함수에 설명 된 대로 잘못 된 매개 변수 예외를 생성할 매개 변수 유효성 검사합니다.
실행을 계속 하도록 허용 된 경우 반환 EOF 또는 WEOF 설정 errno 를 EINVAL합니다.

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
https://msdn.microsoft.com/ko-kr/library/w40768et.aspx

putchar와 putch에 관해 질문드립니다.
https://kldp.org/node/143110

[Embedded] getchar() buffer flushing 관련 문제
https://kldp.org/node/153933

GetKeyState();

GetAsyncKeyState();

initTermios() tcgetattr() getch() getchar() PeekConsoleInput() kbhit() ioctl() conio.h

//
일반 텍스트 매핑 사용
https://msdn.microsoft.com/ko-kr/library/7dzey6h6.aspx

샘플 일반 텍스트 프로그램
https://msdn.microsoft.com/ko-kr/library/4t912wf5.aspx

상수 및 전역 변수 매핑
https://msdn.microsoft.com/ko-kr/library/z94kex77.aspx

데이터 형식 매핑
https://msdn.microsoft.com/ko-kr/library/se784sk6.aspx

루틴 매핑
https://msdn.microsoft.com/ko-kr/library/tsbaswba.aspx

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

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

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

shint의 이미지

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

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

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

댓글 달기

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