{ }codelper

배우기 › C

데이터 · 09

문자열

문자열의 길이, 대문자, 뒤집기, 한 글자 꺼내기.

문자열은 글자들이 줄 선 거예요.
아래 예제는 낱말 하나를 읽어서 길이, 대문자, 뒤집은 문자열, 첫 글자를 차례로 찍어요.

#include <ctype.h>#include <stdio.h>#include <string.h> int main(void) {    char s[101];    scanf("%100s", s);    int n = strlen(s);    printf("%d\n", n);    for (int i = 0; i < n; i++) putchar(toupper((unsigned char)s[i]));    putchar('\n');    for (int i = n - 1; i >= 0; i--) putchar(s[i]);    putchar('\n');    printf("%c\n", s[0]);    return 0;}
stdin
hello
stdout
5
HELLO
olleh
h

핵심

  • 번호는 0부터 시작해요.
    첫 글자는 s[0], 마지막 글자는 길이 - 1번이에요.
  • 길이·대문자·뒤집기·나누기·앞뒤 빈칸 없애기 같은 도구는 어느 언어에나 있고, 이름만 달라요.
  • 잘라 내기는 두 편으로 갈려요.
    끝 번호를 주는 언어에서 "abcdef"의 (1, 3)은 "bc", 개수를 주는 언어에서는 "bcd"예요.
  • 글자는 속으로는 수(문자 코드)예요: A는 65, a는 97.
    C·C++·Java·C#의 char는 그대로 수라서 'A' + 1이 66이에요.
  • C·C++ 말고는 문자열을 고칠 수 없어요.
    바꾸려면 새 문자열을 만들어요.

언어별로 쓰는 법

Python길이 len(s), 대문자 s.upper(), 뒤집기 s[::-1], 나누기 s.split(), 빈칸 없애기 s.strip(), 수로 int(s), 자르기 s[1:3](끝 번호), 코드 ord("A") → 65, chr(97) → "a"
JavaScript길이 s.length, 대문자 s.toUpperCase(), 뒤집기 [...s].reverse().join("")(문자열에는 reverse가 없어요), s.split(" "), s.trim(), 자르기 s.slice(1, 3)(끝 번호), 코드 s.charCodeAt(0), String.fromCharCode(97)
TypeScriptJavaScript와 같아요
Java길이 s.length(), 한 글자는 s.charAt(i)(s[i]가 아니에요), 대문자 s.toUpperCase(), 뒤집기 new StringBuilder(s).reverse(), s.split(" "), s.trim(), 자르기 s.substring(1, 3)(끝 번호)
C#길이 s.Length, 대문자 s.ToUpper(), 뒤집기는 ToCharArray()로 만든 배열을 Array.Reverse, s.Split(' '), s.Trim(), 자르기 s.Substring(1, 3)(개수).
코드를 글자로 되돌리려면 (char)
C++길이 s.size()(또는 s.length()), 대문자는 toupper로 한 글자씩, 뒤집기 std::string(s.rbegin(), s.rend()), 자르기 s.substr(1, 3)(개수)
C길이 strlen(s) — 끝의 \0이 나올 때까지 셀 때마다 훑어요.
대문자는 toupper로 한 글자씩, 뒤집기는 끝에서부터 한 글자씩
Craykon길이 s.길이, 대문자 s.대문자로변환()(소문자 소문자로변환), 뒤집기 s.뒤집기(), s.나누기(" "), s.공백제거(), 수로 s.수로변환(), 자르기 s.부분문자열(1, 3)(개수), 코드 글자.코드("A"), 글자.글자로변환(97)

자주 하는 실수

한글 길이를 바이트로 셌어요C · C++

strlen("한글")

→ 2가 아니라 6 — 바이트 수를 세요. UTF-8에서 한글 한 글자는 3바이트예요(C++ std::string("한글").size()도 6)

C·C++에서는 바이트 수와 글자 수가 다르다는 걸 기억해요.
Python·Java·C#·JavaScript·크레이콘은 2예요.

문자열의 한 글자를 바꿨어요Python · JavaScript · TypeScript · Craykon

s = "abc"
s[0] = "x"

→ Python은 TypeError, JavaScript는 오류 없이 무시, TypeScript는 컴파일 오류, 크레이콘은 "문자열은 한 글자씩 바꿀 수 없어요" 오류

새 문자열을 만들어요.
예: Python "x" + s[1:].

언어마다 다른 점
문자열이 같은지 볼 때 Java는 ==가 아니라 s.equals("yes")를 써요(==는 같은 객체인지를 봐서, 입력으로 받은 yes와 비교하면 false).
C도 ==는 주소 비교라 strcmp(a, b) == 0을 쓰고, Python·JavaScript·C#·C++(std::string)·크레이콘은 ==로 내용을 비교해요.

연습 문제