문자열을 파싱파싱 하려고 하는데 잘 안된다.
기존 문자열에 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;
}
|
'프로그래밍 > [C]' 카테고리의 다른 글
[C]포인터반환, 스택영역 힙영역 (0) | 2020.04.17 |
---|---|
[C] 디버그 모드에서는 에러가 안나는데 릴리즈에서는 나는경우 (0) | 2020.04.13 |
[C]strtok함수 연속사용 NULL문자 (0) | 2020.03.20 |