본문 바로가기

프로그래밍/[C]

[C]strcat, 문자열 포인터

문자열을 파싱파싱 하려고 하는데 잘 안된다.

기존 문자열에 Delimiter들을 없애고 해당 문자열을 리턴 해주는게 목적이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char* textFileParsing(char* inputString)
{
    char outputString[50= "outputString";
    char addString[50= "addString";
    char parsingDelimters[] =" \t";
    
    char* ptr = strtok(inputString, parsingDelimters);
    //strcat(outputString, addString);
    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        //strcat(outputString, ptr);
        ptr = strtok(NULL, parsingDelimters);    
    }
    printf("%s\n", outputString);
    return outputString;
}
 
 

 

문자열을 포인터로 선언

위의 코드를 보면 char행렬이 아닌 문자열 포인터로 선언후

strcat를 하면 런타임 에러가 난다.

이는 문자열 포인터는 읽기 전용 메모리라서 그렇다. 읽는것을 제외하고

편집, 수정등을 할 수 없다. 함수 리턴 값으로 넘겨줄 수 는 있다.

그렇다면 동적 배열을 사용하던가, 고정된 메모리를 할당해서 해결 해야 한다.

동적 배열을 사용해 보겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* textFileParsing(char* inputString)
{
    char* outputString = malloc(sizeof(char)*strlen(inputString));
    strcpy(outputString, "");
    char* addString = "addString";
    char parsingDelimters[] =" \t";
    
    char* ptr = strtok(inputString, parsingDelimters);
    //strcat(outputString, addString);
    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        strcat(outputString, ptr);
        ptr = strtok(NULL, parsingDelimters);    
    }
    printf("%s\n", outputString);
 
    return outputString;
}
 
 

malloc으로 동적 할당을 한뒤, 문자열을 strcpy로 할당해 줘야한다.

(메모리가 할당된 문자열 포인터에 = 으로 문자열을 할당 할 수 없다.)

(메모리 할당만 해놓으면 문자열의 끝을 나타내는 null문자 등이 없어 잘못된 메모리를 참조하게 된다.)

 

실행하니 잘 작동 되었다.

 

하지만 문제가 메모리를 할당했으면 free를 해줘야 하는데 free를 해줘 버리면

return값으로 넘겨 줄 수가 없다.

(애초에 함수 안에서 malloc을 사용한다는 것은, 그 함수 내부에서만 쓰겠다는 소리이다.)

따라서 나는 함수 설계를 잘못한 것이다. 애초 해당 목적에 맞게 함수 결과값을 받을 곳을

파라미터로 받도록 수정하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int textFileParsing(char* inputString, char* outputString)
{
    strcpy(outputString, "");
    printf("strlen: %d\n", strlen(inputString));
    char* addString = "addString";
    char parsingDelimters[] =" \t";
    
    char* ptr = strtok(inputString, parsingDelimters);
    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        strcat(outputString, ptr);
        ptr = strtok(NULL, parsingDelimters);    
    }
    printf("%s\n", outputString);
 
    return outputString;
 
}