본문 바로가기
Coding&Script/C, C++,C#

문자/문자열[char형/%c/getchar(),gets(),gets_s(),strlen(),strcmp(),strcpy(),strcat(),strstr()]

by WeetLies 2019. 3. 20.

C언어 문자

C언어의 문자는 ASCII코드를 따른다. 아스키코드는 0~127중 1byte로 구성되며, 주요문자를 출력하도록 해준다.

*아스키코드로 표현하는 문자


 0

48 

49 

50 

51 

52 

53 

54 

55 

56 

57 


A 

B 

C

D 

E 

F 

G 

H 

I 

J 

K 

L 

M 

N 

O 

P 

Q 

R 

S 

T 

U 

V 

W 

X 

Y 

65 

66 

67 

68 

69 

70 

71 

72 

73 

74 

75 

76 

77 

78 

79 

80 

81 

82 

83 

84 

85 

86 

87 

88 

89 

90 

a

b 

c 

d 

e 

f 

g 

h 

i 

j 

k 

l 

m 

n 

o 

p 

q 

r 

s 

t 

u 

v 

w 

x 

y 

z 

97 

98 

99 

100 

101 

102 

103 

104 

105 

106 

107 

108 

109 

110 

111 

112 

113 

114 

115 

116 

117 

118 

119 

120 

121 

122 

-예제

char형에 a,b,c를 만들고 각각 65, 101, 50 을 값으로 넣고, 화면에 문자로 출력하게 만든다. 결과는 65(A), 101(e), 50(2)가 나온다.


getchar()[각주:1]를 이용해서 사용자에게 값을 입력받고, 그 입력받은 문자와 아스키코드를 화면에 출력한다.

-예제

getchar()를 이용해서 사용자에게 문자를 입력받고, 그 문자에 대해 아스키코드로 나오는 문자형으로 출력한번 진행한 후, 데이터 형으로 한번더 화면에 출력한다. 여기서 c를 입력하면

scanf의 문제점

scanf는 사용자에게 입력을 받는 기초적인 함수이지만, 연속적으로 scanf만 호출하게 되면 제대로 프로그램이 구동되지 않는다. 

-예제

사용자에게 a의 값을 입력받은 후, 화면에 a의 값을 출력하고, 그 후 C의 값을 입력받고 화면에 출력해야 하지만, c가 입력받는공간에는 scanf로 인해 입력된 \n값이 입력 되어있어서 c값을 별도로 입력받지 않는다.

a의 값을 500입력후 엔터 했을때, c의 입력을 받지않고, 프로그램이 마지막줄까지 진행된다.

이때는 정상적으로 작동하기위해서는 입력버퍼를 초기화해주어야한다.

-예제

EOF는 End of File의 약자로 파일의 끝을 표현하는 약자이다.

temp와 EOF와 비교해서 파일의 끝 또는 개행문자가 남아있을경우 남아있는 내용을 지워준다(입력버퍼비우기)

그렇기때문에 정상적으로 작동할 수 있다.


문자열

C언어 자체에서는 문자열을 문자열로 처리하지못하고, 문자의 배열로 처리하게 된다. 

이때 문자배열을 처리하기위해서 gets()[각주:2]함수를 사용하게 된다.

-예제

여기서 gets()함수는 매우 위험한 함수이다. 위의 예제에서는 배열의 크기를 100이라고 정했지만,

gets()함수는 이 배열의 크기를 무시하고 사용자가 입력한만큼의 데이터를 입력받아 출력하게 된다. 즉, 보안상으로 위험한 코드이나 마찬가지이다. 그렇기 때문에 보안성을 강화한 gets_s()함수가 생겨나게되고, 실무에선 gets_s()함수를 사용하게 된다.


배열의 크기는 100으로 정했지만, gets함수가 입력받는 크기는 100을 넘겼지만, 정상적으로 출력하게 만드는 상황


gets_s()함수는 gets()함수에서 매개변수가 추가되었는데, 사용자가 얼마나 입력하든지, 프로그램상에서는 입력받는 크기를 정해두고 그이상의 입력을 받게 되면 런타임에러를 띄우며 프로그램이 종료된다.

gets_s()함수안에, 변수를 입력하고,뒤에는 최대입력받을 사이즈를 입력한다. sizeof는 자료형의 크기를 얻는 함수이다. 여기서 sizeof(a)는 a의 크기만큼을 구해서 지정한다는 의미인데, a는 char형이며, 배열이기때문에 char형(1byte)*배열의크기(100)만큼을 gets_s()함수의 최대 크기로 설정한다.

입력한매개변수의 크기만큼을 초과했을때 뜨는 런타임 에러. 이러한 방식으로 프로그램에서 지정한 크기보다 초과한 입력을 방지한다.


문자열을 처리하는데 쓰이는 여러 함수들

 함수

필요변수 

설명 

예시 

strlen() 

단항/1개 

문자열의길이를 반환 

strlen(a) 

strcmp() 

이항/2개 

문자열a가 문자열b보다 사전적으로 앞에있으면 -1/ 뒤에있으면 1을 반환한다. 

strcmp(a,b) 

strcpy() 

이항/2개 

문자열b의 내용을 문자열a에 복사해넣는다.(덮어씌워버린다) 

strcpy(a,b) 

strcat() 

이항/2개 

문자열a에 문자열b를 더한다.(이어쓰기) 

strcat(a,b) 

strstr() 

이항/2개 

문자열a에 문자열b이 포함되었는지 확인한다. 

존재할경우 찾은 주소값자체를 반환하기때문에 찾은 이후의 모든 문자열이 반환되며, 찾지못할경우에는 (NULL)이 반환된다.

strstr(a,b) 

-예시

결과



  1. 사용자에게 하나의 문자를 입력받는다. 입력받은 값이 아무리 많더라도 맨앞에 입력된 문자만 저장된다. [본문으로]
  2. 사용자에게 문자열을 입력받는 함수, 개행문자(\n)또는EOF를 만나기전까지 입력을 받는다. 사용자의 입력이 없더라도 문자열의 맨마지막에는 \0을 입력해서 넣어 문자열의 끝을 표기한다. [본문으로]

'Coding&Script > C, C++,C#' 카테고리의 다른 글

전역변수/지역변수/정적변수/레지스터변수  (0) 2019.03.20
포인터  (0) 2019.03.19
배열  (0) 2019.03.19
함수/재귀함수  (0) 2019.03.19
반복문(for, while)  (0) 2019.03.18