[완료]문자열을 반환값으로 받으려는데 null로 됩니다.
글쓴이: -@Naver / 작성시간: 목, 2020/05/21 - 12:12오전
vmware 우분투 64비트 18.04 버전입니다.
문자열의 크기가 지정된 크기보다 작으면 (크면 오버플로우 때문에 값이 꼬입니다ㅠㅠ)
문자열 값으로 입력받아서 in_id가 아닌 다른 함수에서 strncpy문으로 돌리려는데,
입력 및 복사(strncpy)로 받은 id 값이 없어집니다.
id 값을 저장?받아서 쓰려면 어떻게 해야 하는지, 모르겠습니다. 도와주세요ㅠㅠ
#define _CTR_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> // #define len 크기 지정은 실제크기+1 로 지정 #define ACCESSlen 2 #define IDlen 2 // 편의상 짧게 변경하고 작업 중... 원래는 10으로 기록해야 함. #define PWDlen 3 // 편의상 짧게 변경하고 작업 중... 원래는 514로 기록해야 함. #define MAX 1024 // 입력받는 임시 문자열 void printBOF_gets(char str[], int strsize, int define_size) { // gets() 버퍼오버플로우 방지 : 재입력 요구 메시지 출력하는 함수 printf("입력한 byte(s)는 %dbyte(s)입니다.\n", strsize-1); printf("입력 가능한 최대 길이 %dbyte(s)보다 %dbyes(s)가 초과됐습니다.\n", define_size-1, strsize-define_size); printf("입력할 데이터를 다시 확인해보세요.\n"); } char in_id() { char id[IDlen] = { 0, }; int strsize = 0; // 실제로 사용자에게 입력 받은 글자수를 확인 char str[MAX] = { 0, }; puts("input id(9bytes 보다 길면 다시 입력함):"); gets(str); strsize = strlen(str)+1; if(strsize > IDlen) { printBOF_gets(str, strsize, IDlen); str[0] = '\0'; in_id(); } else { //if(strsize <= IDlen) { printf("%s", str); //출력 됨 strncpy(id, str, IDlen-1); printf("%s", id); // 출력 됨 return id; } printf("%s", id); // 아무것도 출력 안 됨.ㅠㅠ } int main() { in_id(); return 0; }
Forums:
정상적으로 in에 데이터가 들어가는 else
정상적으로 in에 데이터가 들어가는 else 블록에서는 바로 리턴해버리니까 마지막 printf를 아예 실행도 못 할 거고,
마지막 printf 가 호출되려면 if 블록을 거쳐가는 경로인데 그 경로에는 in 에 뭔가 채워지는 일이 없으니 실행해도 아무것도 안 나오겠죠.
혹시 if {} 안에서 재귀호출되는 in_id()안에서 in을 채워넣은 게 출력될 거라고 생각하셨다면 호출된 in_id의 in과 호출하는 in_id의 in 은 완전히 별개의 지역 변수입니다.
좋은 하루 되세요!
else 의 문자열을 저장?받는 방법은 없는지 궁금합니다.
매번 정성스런 답변 고맙습니다. 제게 많은 격려와 힘이 됩니다^^
if{} 에서 in_id()를 다시 호출하는 이유는
id 값 길이 제한보다 길게 입력받을 경우, 다시 id 값을 입력받기 위함입니다.
else{} 에서는 id를 입력한 사용자가 길이제한을 넘기지 않았기에 입력받은 문자열을 그대로 저장?받기 위함이고요. 그러면,,, 문자열을 저장? 받을 수 있는 방법은 없는지 궁금합니다.
만약…방법이 없다면… 그때는 if{} 부분을 아예 exit(0); 으로 종료시켜야 하나..고민 중입니다.
초보 C언어 학습자. 실력자분들의 도움이 절실합니다.
while(1) {
이면 되지 않나요?
고맙습니다. 말씀해주신대로 했더니 원했던 if도 else도 해결되었습니다. 정말 고맙습니다^^
말씀해주신대로 아래처럼 고쳐서 해결되었습니다. 고맙습니다.
while(1) {
puts("input id(9bytes 보다 길면 다시 입력함):");
gets(str);
strsize = strlen(str)+1;
if(strsize <= IDlen)
break;
printBOF_gets(str, strsize, IDlen);
}
strncpy(id, str, IDlen-1);
초보 C언어 학습자. 실력자분들의 도움이 절실합니다.
댓글 달기