- 포인터로 문자열을 처리 할 수 있다.

 > 포인터로는 문자열을 처리한다기 보다 그냥 지시한다는 표현을 하는 것이 어울린다.

 > '배열'은 '포인터 상수'이다.

 

ex) char str[10]; // 이라는 '문자배열'이 있을 때

strcpy(str, "String"); // 이런 방식으로 문자열을 복사 해서 넣는 것은 가능

str = "String"; // 이런 방식은 불가능 왜냐하면 상수에 값을 넣는 것이기 때문이다.

120 = 2048 와 같은 꼴이다.

 

그래서 str을 문자배열이 아닌 포인터로 선언 즉,

char *str // 이렇게 하면 str은 상수가 아닌 변수가 된다.

그 이후

str = "String"; // 이 가능하다.

 

이 의미는 "String"이라는 문자열 상수가 기억되어 있는 주소를 str에 넣어 준다는 뜻이다.

 

결국,

문자배열로 선언했을 때는 "String"이라는 문자열을 넣을 공간이 확보되어 있으므로 strcpy로 문자열을 넣는 것이 가능하지만,

포인터로 선언했을 때는 문자열을 넣을 공간은 확보하지 않고 단지 문자열이 있는 주소를 넣을 공간만 확보할 뿐이다.

 

그러므로 str이 포인터로 선언된 것이라면 strcpy(str, "String"); // 이렇게 할 경우 잘못하다간 다운이 된다.

 


2022-11-24 댓글 피드백에 의한 수정
char* str = (char*)malloc(6);
strcpy(str,"hello"); // 가능

사유: str 에 충분한 메모리가 할당이 되어있지 않아서, 버퍼 오버플로우가 났을 겁니다. 이 부분 수정부탁드리겠습니다!

 

더보기

#include <stdio.h>

#include <string.h>    // strtok 함수가 선언된 헤더 파일

 

typedef struct _StuGrade {

char stuName[20]; // 학생 이름 

char grade; // 학점 

int midterm; // 중간고사 

int finalterm; // 기말고사 

int quiz; // 퀴즈 

int sum; // 시험 합계 

// 타입이름 

}StuGrade;

 

 

void main(){

 

char *tmp[4];

char c1[30];

StuGrade s;

// 문자열 입력 

 

int i = 0;

 

// stdin으로 부터 문자열을 입력 받아서 c1에 저장하되,

// 널 문자를 포함하여 sizeof(c1)의 크기만큼 저장을 해라 

fgets(c1, sizeof(c1), stdin);

 

char *ptr = strtok(c1, " ");

 

// 입력된 문자를 받아 임시 배열에 넣기 

while(ptr != NULL){

tmp[i] = ptr;

ptr = strtok(NULL, " ");

i++;

}

printf("%s %d %d %d \n", tmp[0], atoi(tmp[1]), atoi(tmp[2]), atoi(tmp[3]));

 

// http://dblab.duksung.ac.kr/ds/grammar/C10.html

// 문자배열에 문자열을 넣을 때 반드시 strcpy함수를 써야 하는 이유 

strcpy(s.stuName, tmp[0]);

s.midterm = atoi(tmp[1]);

s.finalterm = atoi(tmp[2]);

s.quiz = atoi(tmp[3]);

 

printf("%s %d %d %d", s.stuName, atoi(tmp[1]), atoi(tmp[2]), atoi(tmp[3]));

 

}

 

 

 

+ Recent posts