C언어)포인터 함수 인자 받아오는 중 오류

하요미의 이미지

이번에 키생성하는 유틸리티를 만들게되었습니다(콘솔)
그런데 제가 포인터가 아직 머릿속에 콕 안박혀있는지 헷갈리고 이것저것 써보게되네요 하..

일단 키타입이 무엇인지 그리고 키 크기몇인지를 받아와 if문을 걸어 키를생성하는 함수를 돌려서 프로그래밍ㅎㅏ려고하는데여
그 받아오는 과정이 막혀서 진행이안되고있습니다.
디버깅을 잡아보니 Key_Size(char *kt) 함수에서 인자값을 받아오지못하는 현상을 발견하였습니다.

전체소스입니다.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
char* Key_Type()
{
	char Key_t[100];   //100이라고 준이유는 10줬더니 입력을 10글자이상하니까 런타임오류가뜸 . 프로젝트가 죽어버림  (이거에대한 질문 맨 아래에)
	//char *k_ptr;
	//k_ptr = &Key_t[0];
 
	memset(&Key_t[0], 0, 100);  //Key_t배열을 0으로 초기화. 
	printf("Key type? (AES, ARIA, HMAC) // [default ARIA] > ");   //키타입뭘로할꺼니?
	gets(Key_t); // 입력받는다.
 
	if(!strcmp(Key_t, "AES")) //같으면0, 0이 아니니까 참 
	{
		return Key_t;		//AES 반환
	}
 
	else if(!strcmp(Key_t, "ARIA"))
	{
		return Key_t;
	}
 
	else if(!strcmp(Key_t, "HMAC"))
	{
		return Key_t;
	}
 
	else
	{
		printf("Error. Please select correctly.\n"); // 위 세개중에 입력하지않으면 
		exit(-1);				// 강제종료
	}
}
 
 
int Key_Size(char* kt)    // Key_type의 반환값을 kt 인자값으로 받아옴. 그니까 AES였다면 AES를 받아와야함. 그런데 이상한 쓰레기값이 들어있고 받아오질않음
{
	int Key_s = 0;
 
	if(!strcmp(kt, "AES")) // 만일 AES를입력했엇다면 
	{
		printf("Key Size? (128, 192, 256) // [default 256 bits] > ");  //키 사이즈 몇으로 할꺼냐?
		gets_s("%d", Key_s);	//
		if(Key_s!=(128 || 192 || 256))
		{
			printf("Error. Please select key size correctly");
			exit(-1);
		}
	}
 
	else if(!strcmp(kt, "ARIA"))
	{
		printf("Key Size? (128, 192, 256) // [default 256 bits] > ");
	}
 
	else if(!strcmp(kt, "HMAC"))
	{
		printf("Key Size? (128, 160) // [default 160 bits] > ");
	}
 
 
 
}
 
int main()
{
	char *key_type[10];     //키타입 함수에서 반환값 받을 ..
	int key_size;
	char *key_ptr;    //무용지물 
 
	memset(&key_type[0],0,10);
 
	//key_ptr = &key_type[0];
 
	key_ptr = *key_type;
 
	*key_type=Key_Type();
	Key_Size(*key_type);     //Key_Size(key_ptr);   
 
	return 0;
 
}

고수님들... 이건딱히 고수가아니여도 할수잇을것같지만 제 머리가 딸려서 꼭좀 이해좀시켜주세요 ㅠ_ㅠ 부탁드립니다!

그리고 Key_type 함수에서 입력받을 배열 Key_Type[100] 으로 준거요 100글자이상치면 런타임 오류나는데 이거 없이 오류를잡아내고
오류라고 간단하게 프린트문찍고 exit(0) 해줄 방법은없을까요?

감사합니다.

yukariko의 이미지

일단 가장 눈에보이는 오류는
return Key_t;

이부분입니다.

Key_t는 지역변수입니다.
함수내에서 생성되고 함수가 종료되면 같이 할당이 풀립니다.

그런데 함수에서 생성한 배열변수의 주소를 리턴해줘버리면, 그 주소는 함수의 종료와 함께 할당이 풀리기때문에 제대로된 결과를 반영하지 못합니다.
이 경우는 배열을 동적할당으로 받아와서 그 주소를 리턴해주면 해결됩니다.

말씀하신 런타임오류는 gets 함수로는 해결이 되지 않습니다. gets함수가 구식함수이기도하고 안전성에 문제가 있기 때문이죠.
key_size 함수에서 사용하신 gets_s 함수를 쓰셔야할것 같네요.

하요미의 이미지

이번엔 size값을 받아오는게안되서 몇시간째 헤매다가 다시 봤더니 &를 안붙엿더라고요 이런 사소한거를 지나치고 다른데서 찾으려고했다니
어쩃든 답변감사드립니다 다음에도 또 답변해주세요! 감사합니다!

≪지금이 너무 힘들면 잘하고 있는 것이다.≫

댓글 달기

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