c언어 간단한 문제 질문 儆儆儆儆儆

조회수 122회

전역후 복학을 준비하고 있는 대학생입니다. 복학을 준비하면서 c언어 문제를 몇개 풀어보고 있는데 문제를 풀다가 막히는 문제가 생겨 질문을 하게 되었습니다.

  • 다음과 같이 총 3개의 배열을 선언한다. char str1[20]; char str2[20]; char str3[40];

그리고는 str1과 str2를 통해서 프로그램 사용자로부터 문자열을 입력 받되, fgets 함수호출을 통해서 입력 받는다. 이어서 str1에 저장된 문자열을 str3에 복사하고, str2에 저장된 문자열을 str3에 저장된 문자열의 뒤에 덧붙이자. 그리고 마지막으로 str3에 저장된 문자열을 출력하자.

예를 들어서 str1과 str2에 저장된 문자열이 각각 다음과 같다면, str1 "simple" str2 "string"

str3에는 문자열 "simplestring"이 저장되어야 한다.

이런 문제를 풀면서 저는

#include <stdio.h>

int main(void)
{
    char str1[20];
    char str2[20];
    char str3[40];

    fputs("문자열 입력1: ", stdout);
    fgets(str1, sizeof(str1), stdin);
    fputs("문자열 입력2: ", stdout);
    fgets(str2, sizeof(str2), stdin);
    str1[strlen(str1) - 1] = 0;
    str2[strlen(str2) - 1] = 0;
    for (int i = 0; i < strlen(str1); i++)
        str3[i] = str1[i];
    for (int i = 0; i < strlen(str2); i++)
        str3[strlen(str1)+i] = str2[i];
    printf("%s\n", str2);
    printf("조합의 결과: %s", str3);
    return 0;
}

이렇게 풀었더니

조합의 결과 : simplestring儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆string

이렇게 나왔습니다.

뒤에 이 儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆string 이상한건 왜 붙은건가요? str3의 여백부분이 저렇게 나오는건지, 맨뒤에 string은 왜 또 붙는건지 궁금합니다. strncpy함수를 안쓰고 저런식으로 하면 이렇게 나오는건가요?

2 답변

  • 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    -----------------------------------------------------------------
    73 69 6D 70 6C 65 73 74 72 69 6E 67 CC CC CC CC | simplestring儆儆
    CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC | 儆儆儆儆儆儆儆儆
    CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC | 儆儆儆儆儆儆儆儆
    73 74 72 69 6E 67 00                            | string
    

    스택 메모리를 보면 이렇게 되어 있는 거에요.

  • str3에 있는 쓰레기값들이 출력된 결과입니다.

    "abc"와 같은 것을 C언어의 문자열 리터럴(다른 언어에서는 C 스타일 문자열이라고 부름)이라고 합니다.

    실제로 메모리에 저장되는 것은 'a', 'b', 'c', 0 와 같은 4개의 값입니다. 마지막의 0을 분야에 따라서는 널문자 또는 '\0'이라고도 표기합니다.

    문제는 str3에 str1과 str2를 더해준 후에 마지막에 0을 적어줘야지만 정상적인 C 스타일 문자열이 완성되는 것인데. 지금은 그런것을 해주지 않았고 단지 쓰레기 값이 들어 있는 상태에서 printf 함수가 실행되어 우연히 0을 만날때까지 메모리의 값을 순차적으로 출력한 결과를 보고 계신 것입니다.

    printf 함수 출력 전에 아래의 한줄을 추가하시면 됩니다.

    str3[strlen(str1) + strlen(str2)] = 0;
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)