게시판

검색 결과: 25

 

    for (int i = 0; i < sizeof(types) / sizeof(char); i++)

    {
        printf("size: %llu", sizeof(types));

        switch (types[i])


이렇게 해서 보면 sizeof(types)의 결과는 항상 8입니다.

types는 char * 포인터이므로 sizeof(types)는 포인터의 크기를 구하는 것이고, 문자열의 크기를 구하지 않습니다.


Visual Studio에서 조사식에 sizeof(types)를 넣어도 값은 8이고,

printf로 출력해도 8입니다.

32비트 시스템이면 결과는 4이고, 64비트 시스템이면 결과는 8입니다.

sizeof(types)로는 올바른 크기를 구할 수 없으며, while에서 types가 '\0' 널이 아닐 때까지 반복문을 사용하는 게 필요합니다.

types 문자열의 크기를 구해서 하고 싶다면 strlen(types)를 써야 합니다.


, 양 승현님이 작성
 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdarg.h>


int getSum(char* types, ...)

{

int sum = 0;


va_list ap;

va_start(ap, types);

for (int i = 0; i < sizeof(types) / sizeof(char); i++)

{

switch (types[i])

{

case 'i':

sum += va_arg(ap, int);

break;

case 'd':

va_arg(ap, double);

break;

case 's':

va_arg(ap, char*);

break;


default:

break;

}

}

va_end(ap);


return sum;

}


int main()

{

int num1, num2, num3;


scanf("%d %d %d", &num1, &num2, &num3);


printf("%d\n", getSum("isi", num1, "C", 10));

printf("%d\n", getSum("sdsi", "Hello, world!", 5.3, "A", num2));

printf("%d\n", getSum("iiss", 25, 38, "k", "R"));

printf("%d\n", getSum("sidii", "Hello, C", num3, 2.234567, 878, 1291));


return 0;

}


위 코드에서 printf 4번째 getSum의 types매개변수에 "sidii"가 들어갔을 때 정상적으로 작동을 하지 않습니다.

types에 "sidii"가 들어가게 되면 sizeof(types)는 5가 되어야 하는데,

디버그 값에는 4로 나옵니다.

types의 메모리 주소를 디버그로 확인해봐도 5개가 잘 저장되어 있는데 뭐가 문제인가요??


while문을 사용해 types[i] != '\0'; 으로 하면 되긴 하겠지만, 왜 이 상황에서 sizeof(types)가 4로 적용되는지 궁금합니다.

태그:
 
int getSum(char *types, ...) { va_list ap; // 가변 인자 목록 포인터 int i=0; va_start(ap,types); int sum = 0; while (types[i] != '\0') { switch (types[i]) { case 'i': sum += va_arg(ap, int); // 문제가 발생하는지점이 여기인데 왜 안되는지 모르겠습니다. break; case 'd': va_arg(ap, double); break; case 's': va_arg(ap, char *); break; } } va_end(ap); return sum; }
, 배 상훈님이 작성
 

        case 'd':


            result = va_arg(ap, double);


            break;


        case 's':


            result = va_arg(ap, char*);


            break;



코드를 실행하면 값이 이상하게 나옵니다


(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 5월 14일, 목요일, 오후 5:24)

, 도장_ 관리자님이 작성
 

문제의 요구사항을 잘 파악해야 합니다.

요구사항을 보면 정수의 합계만 구해야 합니다.

나머지 형식은 result에 처리하면 안 됩니다.


, 홍 진기님이 작성
 
문의한 코드는 삭제합니다.


값이 이상하게 나옵니다. 어디가 문제인지 지적부탁드립니다

(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 5월 13일, 수요일, 오후 4:46)

, 도장_ 관리자님이 작성
 

부분 완성 문제이고, 제출하면 잘 되는데요?


 

포럼 상단에 66.7로 검색하면 이전 질문과 답변을 볼 수 있습니다.

https://dojang.io/mod/forum/search.php?id=2&search=66.7

참고 후에 결과 알려주세요.



, 손 종익님이 작성
 

int getSum(char *types, ...)


{


    va_list ap;

    int i = 0;

    int result = 0;


    va_start(ap,types);


    while (types[i] != '\0')


    {


        switch (types[i])


        {

case 'i':

                result += va_arg(ap, int);

                break;

            case 'd':

                result = va_arg(ap, double);

                break;

            case 's':

                result = va_arg(ap, char*);

                break;


        default:

            break;

        }

        i++;

    }

    va_end(ap);


    return result;

}



제가 위의 코드로 심사문제 66.7 인증을 진행하고 있는데 생각한대로 잘 되지 않아 질문드립니다.

va_start로 매크로를 실행해서 i, d, s 자료형을 따로 지정해서 정수형을 제외한 나머지 자료형에서도 va_arg 매크로를 실행시켰으나 원하는 값을 가져오지 못했습니다.



혹시 힌트를 좀 주시거나 어느 부분에서 잘못되었는지 이해하기 쉽게 설명해주시면 감사하겠습닌다.