๐ก ์ด๋ฒ์๋ ํฌ์ธํฐ ๊ธฐ๋ฐ ์คํ์ ์ฌ์ฉํ์ฌ ํ์ ํ๊ธฐ๋ฒ ๊ณ์ฐ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
๋ฌธ์
๐ก ์คํ ๊ธฐ๋ฐ ๊ณ์ฐ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ณด์์ค.
๋น์ฐํ ์๋ ๋ฌธ์ ๊ธฐ์ ๋์ถฉ ๋ด๊ฐ ๋ง๋ค์๋ค.
ํด๋ต
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char data[100];
struct Node *next;
} Node;
typedef struct Stack {
Node *top;
} Stack;
void push(Stack *stack, char *data) {
Node *node = (Node*)malloc(sizeof(Node));
strcpy(node->data, data);
node->next = stack->top;
stack->top = node;
}
char* getTop(Stack *stack) {
Node *top = stack->top;
return top->data;
}
char* pop(Stack *stack) {
if (stack->top == NULL) {
printf("์คํ ์ธ๋ํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ต๋๋ค.\\n");
return NULL;
}
Node *node = stack->top;
char *data = (char*)malloc(sizeof(char) * 100);
strcpy(data, node->data);
stack->top = node->next;
free(node);
return data;
}
int getPriority(char *i) {
if (!strcmp(i, "(")) return 0;
if (!strcmp(i, "+") || !strcmp(i, "-")) return 1;
if (!strcmp(i, "*") || !strcmp(i, "/")) return 2;
return 3;
}
char* transition(Stack *stack, char **s, int size) {
char res[1000] = "";
for (int i = 0 ; i < size ; i++) {
if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) {
while (stack->top != NULL && getPriority(getTop(stack)) >= getPriority(s[i])) {
strcat(res, pop(stack));
strcat(res, " ");
}
push(stack, s[i]);
} else if (!strcmp(s[i], "(")) {
push(stack, s[i]);
} else if (!strcmp(s[i], ")")) {
while (strcmp(getTop(stack), "(")) {
strcat(res, pop(stack));
strcat(res, " ");
}
pop(stack);
} else {
strcat(res, s[i]);
strcat(res, " ");
}
}
while (stack->top != NULL) {
strcat(res, pop(stack));
strcat(res, " ");
}
return res;
}
void calculate(Stack *stack, char **s, int size) {
int x, y, z;
for (int i = 0 ; i < size ; i++) {
if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) {
x = atoi(pop(stack));
y = atoi(pop(stack));
if (!strcmp(s[i], "+")) {
z = y + x;
}
if (!strcmp(s[i], "-")) {
z = y - x;
}
if (!strcmp(s[i], "*")) {
z = y * x;
}
if (!strcmp(s[i], "/")) {
z = y / x;
}
char buffer[100];
sprintf(buffer, "%d", z);
push(stack, buffer);
} else {
push(stack, s[i]);
}
}
printf("%s\\n", pop(stack));
}
int main(void) {
Stack stack;
stack.top = NULL;
char a[100] = "( ( 3 + 4 ) * 5 ) - 5 * 7 * 5 - 5 * 10";
int size = 1;
for (int i = 0 ; i < strlen(a) ; i++) {
if (a[i] == ' ') {
size++;
}
}
char *ptr = strtok(a, " ");
char **input = (char**)malloc(sizeof(char*) * size);
for (int i = 0 ; i < size ; i++) {
input[i] = (char*)malloc(sizeof(char) * 100);
}
for (int i = 0 ; i < size ; i++) {
strcpy(input[i], ptr);
ptr = strtok(NULL, " ");
}
char b[1000] = "";
strcpy(b, transition(&stack, input, size));
printf("ํ์ ํ๊ธฐ๋ฒ : %s\\n", b);
size = 1;
for (int i = 0 ; i < strlen(b) - 1 ; i++) {
if (b[i] == ' ') {
size++;
}
}
char *ptr2 = strtok(b, " ");
for (int i = 0 ; i < size ; i++) {
strcpy(input[i], ptr2);
ptr2 = strtok(NULL, " ");
}
calculate(&stack, input, size);
return 0;
}
์ค๋ช
์ฝ๋๊ฐ ์ ๋ง ๊ธธ๋ค.
์ด๋ฒ์๋ ์ฌ์ฉํด๋ณด์ง ์์ ํจ์๋ ์จ๋ณด๊ณ , ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ฅ ํจ์์๋ํด์๋ ํจ๊ป ์ค๋ช ํด๋ณด๊ฒ ๋ค.
์ค์ ํ๊ธฐ๋ฒ์ ํ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณ๊ฒฝ
- ์ค์ ํ๊ธฐ๋ฒ์ ํ์ ์ฐ๋ฆฌ๊ฐ ์ ์๋ ํ๊ธฐ๋ฒ์ด๋ค.
- ์) 7 * 5 + 3
- ํ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ด์ ๋ ์ปดํจํฐ๊ฐ ๊ณ์ฐํ๊ธฐ์ ํธํ ์์์ ํํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์) 7 5 * 3 +
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ typedef์ผ๋ก ๊ตฌ์กฐ์ฒด ์ ์ธ
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // ๋ฌธ์์ด์ ์ฒ๋ฆฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ string.hํ์ผ์ include ํด์ค๋ค.
typedef struct Node {
char data[100]; // ์ซ์๊ฐ ๊ธธ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด๋ก ์ด๊ธฐํ ํ๋ค.
struct Node *next;
} Node;
typedef struct Stack {
Node *top;
} Stack;
typedef ๋ ์์ ๋ถํฐ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ ๋ฌด์์ธ์ง๋ ์ ๋๋ก ๋ชจ๋ฅด๊ณ ์ง๋๊ฐ๋ค.
typedef ํค์๋๋ C์ธ์ด์์ ์๋ฃํ์ ์๋กญ๊ฒ ์ด๋ฆ์ ๋ถ์ผ ๋ ์ฐ๋ ํค์๋๋ค.
typedef๋ฅผ ์ด์ฉํ๋ฉด mainํจ์์์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํ ๋ ๋งค๋ฒ struct ํค์๋๋ฅผ ์จ์ค ํ์๊ฐ ์๋ค.
๊ตฌ์กฐ์ฒด์ ๋ณ์นญ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ ๋ ์ค๊ดํธ ๋ค์ ์จ์ฃผ๋ฉด ๋๋ค.
typedef๋ฅผ ์ด์ฉํ ๊ตฌ์กฐ์ฒด ์ ์ธ - ํ ๋์ ๋๋ด๋ C์ธ์ด ๊ธฐ์ด
push ํจ์
void push(Stack *stack, char *data) {
Node *node = (Node*)malloc(sizeof(Node));
strcpy(node->data, data); // ๊ฐ ๋
ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ๋ฐ์ดํฐ ์ฆ ๋ฌธ์์ด์ ๋
ธ๋ ์์ ๋ด์์์๊ฒ ํ๋ค.
node->next = stack->top; // ํ์ฌ ์คํ์ ํ์ ๋
ธ๋์ ๋ค์์ด ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
stack->top = node; // ์คํ์ ํ์ ๋
ธ๋๊ฐ ๋ ์ ์๊ฒ ํ๋ค.
}
strcpy() ์ str(=string), cpy(=copy)๋ก ๋ฌธ์์ด์ ๋ณต์ฌํ๋ ํจ์์ด๋ค.
ํจ์ ์ํ์ char* strcpy(char* dest, const char* origin); ์ด๋ค.
origin์ ์๋ ๋ฌธ์์ด ์ ์ฒด๋ฅผ dest๋ก ๋ณต์ฌ๋ฅผ ํ๋ ํจ์์ด๋ค.
์๋์ ์์ ๋ฅผ ๋ณด์
char origin[] = "BlockDMask"; //"BlockDMask\\0" ์ด๋ฏ๋ก size = 11;
char dest3[] = "STRCPY_EXAMPLE"; // size = 15;
strcpy(dest3, origin);
printf(" case3 before : %s\\n", dest3);
dest3[10] = 'y'; //'\\0' -> 'y'
printf(" case3 after : %s\\n", dest3);
// case3 before : BlockMask
// case3 after : BlockMaskyPLE
๋ณต์ฌ๋ฅผ ํ ๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ‘\0’๊น์ง ๋ณต์ฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ dest3[10] ์์ '\\0' -> 'y' ๋ก ๋ณ๊ฒฝํด์ฃผ์ง ์์ผ๋ฉด ‘\0’ ๊น์ง๋ฐ์ ์ธ์ํ์ง ๋ชปํ์ฌ BlockMask ๋ก ์ถ๋ ฅ์ด ๋๋ค.
๋๋
char origin[] = "BlockDMask";
char dest2_1[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char dest2_2[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
strncpy(dest2_1, origin, sizeof(origin));
strncpy(dest2_2, origin, sizeof(origin) - 1);
printf(" case2_1 : %s\\n", dest2_1);
printf(" case2_2 : %s\\n", dest2_2);
// case2_1 : BlockMask
// case2_2 : BlockMaskaaaaaaaaaaaaaaaaaaa
์ด๋ ๊ฒ sizeof(origin) -1) ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
[C์ธ์ด/C++] strcpy, strncpy ํจ์(๋ฌธ์์ด ๋ณต์ฌ)์ ๋ํด์
๋ด๊ฐ ์ฌ์ฉํ ์์ ๋ฅผ ๋ณด๋ฉด typedef์์ data[100]์ผ๋ก ์ด๊ธฐํํ์ฌ ๊ธด ๋ฌธ์์ด๋ ์ฒ๋ฆฌํ ์ ์๊ฒ๋ ํด๋์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์๋ฆผ ์์ด ์ ๋ณต์ฌ๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค.(์ถ์ธก)
getTop ํจ์
char* getTop(Stack *stack) {
Node *top = stack->top; // ์ต์๋จ ๋
ธ๋๋ฅผ ๋ฐํํ ์ ์๊ฒ ํ๋ค.
return top->data; // top์ data๋ฅผ ๋ฐํํ๋ค.
}
pop ํจ์
char* pop(Stack *stack) {
if (stack->top == NULL) {
printf("์คํ ์ธ๋ํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ต๋๋ค.\\n");
return NULL;
}
Node *node = stack->top;
char *data = (char*)malloc(sizeof(char) * 100);
strcpy(data, node->data);
stack->top = node->next;
free(node);
return data;
}
pop ํจ์๋ [C์ธ์ด ํฌ์ธํฐ ๊ธฐ๋ฐ ์คํ ์๊ณ ๋ฆฌ์ฆ] ์คํ ์ฝ์ ๋ฐ ์ญ์ ํ๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
getPriority ํจ์
int getPriority(char *i) {
if (!strcmp(i, "(")) return 0; // ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ์
if (!strcmp(i, "+") || !strcmp(i, "-")) return 1;
if (!strcmp(i, "*") || !strcmp(i, "/")) return 2;
return 3;
}
0์ด๋ฉด ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ๊ณ , ์๊ฐ ์ปค์ง ์๋ก ์ฐ์ ์์๊ฐ ์ปค์ง๋ค.
transition ํจ์
// ํ์ํ๊ธฐ๋ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ํจ์
/* s๋ 37 * 5๋ผ๊ณ ๋ค์ด์์ ๋
* "37", "*", "5" ๋ผ๊ณ ๊ฐ ๋ฌธ์์ด๋ก ๋ณธ๋ค๋ ๋ป์ด๋ค.
* size๋ ๊ฐ ๋ค์ด์ค๋ ๋ฌธ์์ด์ ์ฌ์ด์ฆ์ด๋ค. */
char* transition(Stack *stack, char **s, int size) {
char res[1000] = "";
for (int i = 0 ; i < size ; i++) {
// ๋ฌธ์์ด์ด ์ฐ์ฐ์์ธ์ง ์ฒดํฌํ๋ค.
if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) {
// ์๊ธฐ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๊ฒ์ ๋ฝ๋๋ค.
while (stack->top != NULL && getPriority(getTop(stack)) >= getPriority(s[i])) {
// ์์ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๊ฒ๋ค ๋จผ์ ์คํ์์ ๋ฝ์ ๋ค์ ๋ฝ์ ๋ฐ์ดํฐ๋ฅผ res์ ๋ฃ์ด์ค๋ค.
strcat(res, pop(stack));
// 3 + 5๊ฐ ๋ค์ด์ค๋ฉด 3 5 + ์ด๋ ๊ฒ ๋์ด์ฐ๊ธฐ๋ฅผ ํด์ค๋ค.
strcat(res, " ");
}
// stack์ ๋ฃ์ด์ค๋ค.
push(stack, s[i]);
// ๋ฌธ์์ด์ด "("์ธ์ง ์ฒดํฌํ๋ค.
} else if (!strcmp(s[i], "(")) {
push(stack, s[i]);
// ๋ฌธ์์ด์ด ")"์ธ์ง ์ฒดํฌํ๋ค.
} else if (!strcmp(s[i], ")")) {
// ")"์ด ๋์๋ค๋ฉด "("๊ฐ ๋์ฌ๋๊น์ง ์คํ์์ ๋ฝ์์ ๊ฒฐ๊ณผ ๋ฐฐ์ด(res)์ ๋ฃ์ด์ค๋ค.
while (strcmp(getTop(stack), "(")) {
strcat(res, pop(stack));
strcat(res, " ");
}
// "("๋ stack์์ ๋์ฌ ์ ์๊ฒ ํ๋ค.
pop(stack);
} else {
// ์ผ๋ฐ ์ซ์์ธ ๊ฒฝ์ฐ ๋ฐ๋ก ์ถ๋ ฅํ๋ค.
strcat(res, s[i]);
strcat(res, " ");
}
}
// ์คํ์ ๋จ์์๋ ๋ฌธ์๊ฐ ์๋ค๋ฉด ๋ค ๊บผ๋ด์ค๋ค.
while (stack->top != NULL) {
strcat(res, pop(stack));
strcat(res, " ");
}
return res;
}
์ด๋ฒ์๋ ๋ชจ๋ฅด๋ ํจ์๊ฐ ๋ ๊ฐ๊ฐ ๋์๋ค.
- strcmp(string1, string2)
- ์ํ์ int strcmp( const char *string1, const char *string2); ์ด๋ค.
- string1๊ณผ string2 ๋ ๋ฌธ์์ด์ ๋น๊ตํ๋ค.
- ๋ฆฌํด๊ฐ์ด -1 ์ผ ๋ : ๋ ๋ฌธ์์ด์ ๋น๊ตํ์ฌ, ํ๋ฆฐ ์ฒซ๋ฒ์งธ ๋ฌธ์๊ฐ string1์ด ๋ ์์ ๋ -1์ ๋ฆฌํดํ๋ค.
- ๋ฆฌํด๊ฐ์ด 0์ผ ๋ : ๋ ๋ฌธ์์ด์ด ๊ฐ๋ค.
- ๋ฆฌํด๊ฐ์ด 1์ผ ๋ : ๋ ๋ฌธ์์ด์ ๋น๊ตํ์ฌ, ํ๋ฆฐ ์ฒซ๋ฒ์งธ ๋ฌธ์๊ฐ string1์ด ๋ ํด ๋ 1์ ๋ฆฌํดํ๋ค.
- ์์ ์ฝ๋ transition์์ ์ !strcmp(string1, string2) ๋ฅผ ์ผ์๊น์ ๋ํ ์๋ฌธ์ด ๋ค์๋ค.
- ์ด๊ฒ์ ๋ํ ํด๋ต์ ์์คํค ์ฝ๋ ๊ฐ์ ์๋ค.
- C์ธ์ด์์ 0์ false๊ฐ์ด๋ฏ๋ก string1์ string2๊ฐ ๊ฐ์์ ๋ฆฌํด 0์ ํด์ค๋ค๋ฉด false ๊ฐ์ผ๋ก if๋ฌธ ์์ผ๋ก ๋ค์ด๊ฐ ์ ์๋ ๊ฒ์ด๋ค.
} else if (!strcmp(s[i], ")")) { // ")"์ด ๋์๋ค๋ฉด "("๊ฐ ๋์ฌ๋๊น์ง ์คํ์์ ๋ฝ์์ ๊ฒฐ๊ณผ ๋ฐฐ์ด(res)์ ๋ฃ์ด์ค๋ค. while (strcmp(getTop(stack), "(")) { strcat(res, pop(stack)); strcat(res, " "); } // "("๋ stack์์ ๋์ฌ ์ ์๊ฒ ํ๋ค. pop(stack); }
- ๊ทธ๋ผ ์ด ์ฝ๋์์๋ strcmp ๋ฅผ ์ผ์ผ๋ฏ๋ก 0์ด ์๋ ๊ฐ์ ๋ชจ๋ true๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ๊ดํธ๋ฅผ ๋นผ๋ ์์ ์ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
[C์ธ์ด&C++] strcmp, strncmp ํจ์(๋ฌธ์์ด ๋น๊ต ํจ์)
- strcat(dest, origin)
- ์ํ์ char* strcat(char* dest, const char* origin); ์ด๋ค.
- origin์ ์๋ ๋ฌธ์์ด์ dest ๋ค์ชฝ์ ์ด์ด ๋ถ์ด๋ ํจ์ ์ด๋ค.
- dest ๋ฌธ์์ด ๋์ ์๋ ‘\0’์ ์ฌ๋ผ์ง๊ณ ๊ทธ ์์น์ ๋ฐ๋ก ๋ถ๋ ๊ฒ์ด ํน์ง์ด๋ค.
[C์ธ์ด/C++] strcat, strncat ๋ฌธ์์ด ์ฐ๊ฒฐ ํจ์์ ๋ํด์
calculate ํจ์
void calculate(Stack *stack, char **s, int size) {
int x, y, z;
for (int i = 0 ; i < size ; i++) {
if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) {
x = atoi(pop(stack));
y = atoi(pop(stack));
// y๊ฐ ๋ ๋จผ์ ๋ค์ด๊ฐ ๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ y๊ฐ ๋จผ์ ๋ค์ด๊ฐ์ผ ํ๋ค.
if (!strcmp(s[i], "+")) {
z = y + x;
}
if (!strcmp(s[i], "-")) {
z = y - x;
}
if (!strcmp(s[i], "*")) {
z = y * x;
}
if (!strcmp(s[i], "/")) {
z = y / x;
}
char buffer[100];
// ๊ณ์ฐ๋ ์ซ์์ํํ๋ฅผ ๋ฌธ์๋ก ๋ฃ๊ฒ ๋ค๋ ๊ฒ ์ด๋ค.
sprintf(buffer, "%d", z);
// ๊ทธ๊ฒ์ ๋ค์ ์คํ์ ๋ฃ๊ฒ ๋ค๋ ๊ฒ ์ด๋ค.
push(stack, buffer);
} else {
push(stack, s[i]);
}
}
printf("%s\\n", pop(stack));
}
์ด๋ฒ์๋ ๋ชจ๋ฅด๋ ํจ์๊ฐ ๋ ๊ฐ ๋์๋ค.
- atoi(cStr)
- ์ํ์ int atoi (const char* cStr); ์ด๋ค.
- ๋ฌธ์์ด์ ์ ์ ํ์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์์ด๋ค.
- ์ด์ธ์๋
- atof = char to double : ๋ฌธ์์ด์ ์ค์ ํ์ ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- atol = char to long int : ๋ฌธ์์ด์ long ์ ์ ํ์ ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
[C์ธ์ด/C++] atoi, atof, atol ํจ์ (char* to int)
- sprintf(str, "๋ฌธ์์ด");๋๋ sprintf(str, "%d", 10);
- sprintf(str, "๋ฌธ์์ด"); ์ str ๋ฌธ์์ด์ “๋ฌธ์์ด”์ด ์ ์ฅ๋๋ค.
- sprintf(str, "%d", 10); ์ str ๋ฌธ์์ด์ ๋ฌธ์์ด “10”์ด ์ ์ฅ๋๋ค.
main ํจ์
int main(void) {
Stack stack;
stack.top = NULL;
char a[100] = "( ( 3 + 4 ) * 5 ) - 5 * 7 * 5 - 5 * 10"; // ๊ณ์ฐ ์์
int size = 1; // ๊ฐ ๋ฌธ์์ด์ ๊ฐ์
for (int i = 0 ; i < strlen(a) ; i++) {
if (a[i] == ' ') {
size++;
}
}
char *ptr = strtok(a, " "); // ๋์ด์ฐ๊ธฐ๋ฅผ ์ด์ฉํ์ฌ ํ ํฐ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
char **input = (char**)malloc(sizeof(char*) * size); // ํ์ํ๊ธฐ๋ฒ์ ๋ฃ์ผ๋ ค๋ ์
๋ ฅ๊ฐ
for (int i = 0 ; i < size ; i++) {
input[i] = (char*)malloc(sizeof(char) * 100); // ๊ฐ ๋ฌธ์์ด์ ์ต๋ 100๊น์ง
}
// ๋์ด์ฐ๊ธฐ๋ก ์ด๋ฃจ์ด์ง ๊ฐ ๋ฌธ์์ด ๋ฐฐ์ด ํํ๋ก ์ธํ์ ๋ด๊ธฐ๊ฒ๋๋ค.
for (int i = 0 ; i < size ; i++) {
strcpy(input[i], ptr); // ํ ํฐ์ผ๋ก ๋ถ๋ฆฌ๋ ๊ฐ ๋ฌธ์์ด ๋ณต์ฌํ๋ค.
ptr = strtok(NULL, " "); // ๊ทธ ๋ค์ ํ ํฐ์ ํ์ธํ๋ค.
}
char b[1000] = "";
strcpy(b, transition(&stack, input, size));
printf("ํ์ ํ๊ธฐ๋ฒ : %s\\n", b);
size = 1;
for (int i = 0 ; i < strlen(b) - 1 ; i++) { // ๋ง์ง๋ง์ ํญ์ ๊ณต๋ฐฑ์ด ๋ค์ด๊ฐ๋ฏ๋ก 1์ ๋บ๋ค.
if (b[i] == ' ') {
size++;
}
}
char *ptr2 = strtok(b, " ");
for (int i = 0 ; i < size ; i++) {
strcpy(input[i], ptr2);
ptr2 = strtok(NULL, " ");
}
calculate(&stack, input, size);
return 0;
}
์ด๋ฒ์๋ ๋ชจ๋ฅด๋ ํจ์๊ฐ ๋ ๊ฐ ์์๋ค.
- strlen(a)
- ์ํ์ size_t strlen(const char* str); ์ด๋ค.
- C์ธ์ด ๋ฌธ์์ด์ ๋ฐ์์ ๊ทธ๊ฒ์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ํจ์์ธ๋ฐ ๋ฌธ์์ด์ ๋์ ์๋ ค์ฃผ๋ ‘\0’ ๋ฌธ์๊ฐ ๋์ฌ๋๊น์ง์ ๋ฌธ์๋ค์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
- ๊ทธ๋ผ strlen ๊ณผ sizeof ์ ๋ค๋ฅธ์ ์ ๋ฌด์์ผ๊น?
- strlen ์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ธ๋ฉ ๋ ๋ฌธ์์ด์ ๊ธธ์ด์ด๋ฉฐ NULL์ ์ ์ธํ๋ค. NULL์ ๋ง๋๊ฒ ๋๋ฉด strlen ์ NULL ์ ์ ๊ธธ์ด ๊ฐ์ ๋ฆฌํดํ๋ค.
- sizeof ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํธ์ ๊ธธ์ด์ด๋ค.
- ๊ธฐ์ต์ ๋๋ฌ์ด๋ณด๋ length๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ๋ชฐ๋ผ์ sizeof ๋ก ๊ฐ์ ๊ตฌํ ๋ค int์ ๊ฐ์ ๋ ๊ตฌํด์ length๋ฅผ ๊ตฌํ๋ ๊ธฐ์ต์ด ์๋ค.
[C์ธ์ด] strlen๊ณผ sizeof ์ฐจ์ด
[C์ธ์ด/C++] strlen ํจ์(๋ฌธ์์ด ๊ธธ์ด)์ ๋ํด์
- strtok(str, delimiters)
- ์ํ์ char* strtok(char* str, char* delimiters); ์ด๋ค.
- strtok์ ํจ์์ ์ด๋ฆ์ string+tokenize๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ ๋ฌธ์์ด์ ํ ํฐ์ฒ๋ผ ์กฐ๊ฐ์กฐ๊ฐ ๋ด๋ ํจ์์ด๋ค.
- char* ํ์ ์ ๋ฌธ์์ด str์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์, ๋๋ฒ์งธ ๋ค์ด์จ char* ํ์ ์ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ์๋ผ์ ํฌ์ธํฐ๋ฅผ ํ๋์ฉ ๋ฐํํ๋ค.
- ์์ main ํจ์์์๋ ๋์ด์ฐ๊ธฐ๋ฅผ ๊ตฌ๋ถ์๋ก ํ ํฐ์ผ๋ก ๋ง๋ค์ด์ฃผ์๋ค.
- strtok(NULL, " "); ํจ์๋ฅผ ์จ์ฃผ๋ฉด ๋ค์ ๋์ด์ฐ๊ธฐ๋งํผ์ ํ ํฐ์ ๋ง๋ค์ด์ค๋ค.
- ๋ฌธ์์ด์ ๋๊น์ง ํ์ํ๋ค๋ฉด strtok ํจ์๋ NULL์ ๋ฐํํ๊ฒ ๋๋ค.
[C์ธ์ด/C++] strtok ํจ์(๋ฌธ์์ด ์๋ฅด๊ธฐ)์ ๋ํด์.
๋ง์น๋ฉฐ..
์ฝ๋๊ฐ ๊ธธ๊ณ ๊ฐ์ฌ๋์ด ์น๋ ์ฝ๋ ์คํ์ผ๊ณผ ๋ด๊ฐ ์น๋ ์ฝ๋ ์คํ์ผ์ด ๋ฌ๋ผ์ ์คํ๋ก ๊ณ ์ ๋ง์ด ํ๋ ๊ฐ์์๋ค.
ํจ์๋ฅผ ์ฐพ์๋ณด๋ฉด์ ๊ณต๋ถํ๋ ๊ฒ์ด ์๊ฐ์ด ํจ์ฌ ๋ง์ด ๋ค๊ธฐ๋ ํ์ง๋ง ๊ทธ๋๋ ์ดํด๊ฐ ๋ ์๋๋ ๊ฒ ๊ฐ๋ค.