- 1 1. Pendahuluan
- 2 2. Apa itu string dalam C-gengo? Konsep dasar dan pentingnya karakter terminasi
- 3 3. Cara memotong substring dalam bahasa C 【Bagian pustaka standar】
- 4 4. Cara Memotong Substring di Bahasa C【Bagian Fungsi Buatan】
- 5 5. Metode Pemotongan String per Kode Karakter
- 6 6. Cara Memisahkan String dengan Bahasa C
- 7 7. Contoh aplikasi: Cara mengekstrak sebelum dan sesudah karakter tertentu
- 8 8. Ringkasan
1. Pendahuluan
Operasi string dalam bahasa C adalah salah satu keterampilan penting dalam belajar pemrograman. Terutama, pemotongan string (ekstraksi substring) sering digunakan saat memproses data atau melakukan konversi format.
Dalam artikel ini, cara memotong string dalam bahasa C tentang, cara menggunakan fungsi pustaka standar, cara membuat fungsi buatan sendiri, dukungan karakter multibyte (bahasa Jepang), cara membagi string dll akan dijelaskan secara detail. Selain itu, contoh aplikasi dan penanganan error juga akan diperkenalkan, jadi silakan baca sampai akhir.
Apa yang dapat dipelajari dari artikel ini
Dengan membaca artikel ini, Anda dapat memperoleh keterampilan berikut.
- Konsep dasar string dalam bahasa C dan karakter terminasi perannya
strncpy
strchr
fungsi pustaka standar lainnya untuk mengekstrak substring- fungsi buatan
- Mengingat karakter multibyte (Jepang)
strtok
cara memisahkan string- Metode untuk mengambil karakter sebelum dan sesudah karakter tertentu
Penjelasan akan diberikan dengan contoh kode agar mudah dipahami bahkan oleh pemula.
Mengapa pemotongan string dalam bahasa C penting?
Bahasa C menganggap string sebagai ‘array (array tipe char)’ sehingga tidak dapat dengan mudah mengambil substring seperti bahasa tingkat tinggi lainnya (Python, JavaScript, dll). Oleh karena itu, penting untuk memilih metode yang tepat dalam situasi berikut.
1. Pemrosesan data input
Misalnya, saat menganalisis data seperti log atau file CSV, perlu mengekstrak item tertentu.
2. Mencari kata kunci tertentu
Mencari kata kunci tertentu dalam sebuah string dan mengambil informasi di sekitarnya sangat penting untuk fungsi pencarian dan ekstraksi data.
3. Peningkatan keamanan program
Dengan menggunakan fungsi seperti strncpy
, dapat mencegah buffer overflow (penulisan data yang melebihi ukuran buffer). Ini penting untuk menghindari risiko keamanan.
Struktur artikel ini
Artikel ini akan dijelaskan dengan alur berikut.
- Apa itu string dalam bahasa C? Konsep dasar dan pentingnya karakter terminasi
- Cara mengekstrak substring dalam bahasa C【Pustaka Standar】
- Cara mengekstrak substring dalam bahasa C【Versi fungsi buatan sendiri】
- Metode pemisahan string berdasarkan kode karakter
- Cara memisahkan string dalam bahasa C
- Contoh penerapan: Cara mengekstrak karakter sebelum dan sesudah tertentu
- Ringkasan
- FAQ
Mari kita mulai dengan melihat secara detail ‘Apa itu string dalam bahasa C? Konsep dasar dan pentingnya karakter terminator’.
2. Apa itu string dalam C-gengo? Konsep dasar dan pentingnya karakter terminasi
2.1 Konsep dasar string dalam C-gengo
String adalah “array char”
Dalam C-gengo, string diperlakukan sebagai array karakter (array tipe char) . Misalnya, kode berikut adalah contoh dasar definisi dan penampilan string.
#include <stdio.h>
int main() {
char str[] = "Hello, World!"; // Define a string literal as an array
printf("%s ", str); // Output the string
return 0;
}
Dalam kode ini, "Hello, World!"
disimpan sebagai array tipe char
, dan dicetak dengan printf("%s\n", str);
.
Struktur internal string
String "Hello"
disimpan di memori sebagai berikut.
indeks | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
teks | H | e | l | l | o | \0 |
Dalam C-gengo, karakter khusus yang menunjukkan akhir string (karakter null '\0'
) secara otomatis ditambahkan di akhir , sehingga panjang string menjadi “jumlah karakter sebenarnya + 1”.
2.2 Pentingnya karakter terminasi (karakter null 'Apa itu karakter null?
'
)
Apa itu karakter null?
'Masalah ketika tidak ada karakter null
Karakter null ('\0'
) adalah karakter khusus yang menandakan akhir string. Untuk menangani string dalam C-gengo dengan benar, Anda harus memahami keberadaan karakter null ini.
#include <stdio.h>
int main() {
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // Explicitly specify the null terminator
printf("%s ", str); // Display correctly
return 0;
}
Dalam kode di atas, jika '\0'
tidak ada, akhir "Hello"
tidak dikenali, sehingga mungkin terjadi perilaku yang tidak diinginkan.
2.3 Cara yang benar mendefinisikan string
Seperti di bawah ini, jika karakter terminasi terlupa , dapat menyebabkan perilaku memori yang tidak normal.
#include <stdio.h>
int main() {
char str[5] = {'H', 'e', 'l', 'l', 'o'}; // Does not include the null terminator
printf("%s ", str); // May cause unexpected behavior
return 0;
}
Penyebab error
printf("%s\n", str);
karakter null'\0'
sampai menemukan melanjutkan output karakter- Jika tidak ada, ada kemungkinan data lain di memori akan keluar.
Metode ① Menggunakan literal string
Metode ② Mendefinisikan array secara eksplisit
Cara paling umum untuk mendefinisikan string adalah dengan menggunakan literal string.
char str[] = "Hello";
Dengan metode ini, kompiler C secara otomatis menambahkan karakter null '\0'
, sehingga tidak memerlukan penanganan khusus.
2.4 Cara memeriksa ukuran string
Jika Anda mendefinisikan secara manual termasuk '\0'
, tulis seperti berikut.
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
- Tentukan ukuran karakter, dan penting untuk menambahkan di akhir.
- Jika Anda lupa memasukkan ke dalam , akan terjadi perilaku yang tidak terduga.
Operasi strlen
Untuk mendapatkan panjang string (jumlah karakter), gunakan fungsi strlen
.
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("Length of the string: %lu\n", strlen(str)); // Outputs 5 (does not include the null terminator)
return 0;
}
2.5 Ringkasan
strlen
karakter null'\0'
munculsizeof(str)
3. Cara memotong substring dalam bahasa C 【Bagian pustaka standar】
- String dalam bahasa C
char
diwakili oleh array - Karakter akhir (karakter null
'\0'
) menunjukkan akhir string, jadi harus selalu disertakan - Untuk mendapatkan panjang string, gunakan
strlen
gunakan - Jika tidak mendefinisikan string dengan cara yang tepat, kemungkinan akan terjadi kesalahan yang tidak terduga

3.1 strncpy
untuk pengambilan substring
Untuk memotong substring dalam bahasa C, ada cara memanfaatkan pustaka standar. Pada bagian ini, kami menjelaskan cara mengambil sebagian string dengan menggunakan strncpy
dan strchr
serta fungsi pustaka standar lainnya.
strncpy
Struktur dasar
strncpy
adalah fungsi yang menyalin sebagian string ke buffer lain.
Contoh penggunaan dasar
char *strncpy(char *dest, const char *src, size_t n);
dest
src
n
'\0'
strncpy
Poin penting
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[6]; // Buffer to store the substring
strncpy(dest, src, 5); // Copy the first 5 characters "Hello"
dest[5] = '\0'; // Manually add the null terminator
printf("Substring: %s\n", dest); // Output "Hello"
return 0;
}
3.2 strncpy_s
untuk penyalinan string aman
- Karakter null
'\0'
harus ditambahkan secara manualstrncpy
n
'\0'
tidak menambahkan secara otomatisdest[n] = '\0';
- Perhatikan buffer overflow
dest
n
strncpy_s
Struktur dasar
strncpy_s
adalah versi yang meningkatkan keamanan strncpy
, sehingga dapat mencegah buffer overflow.
Contoh penggunaan
errno_t strncpy_s(char *dest, rsize_t destsz, const char *src, rsize_t n);
dest
destsz
dest
src
n
strncpy_s
Keuntungan
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[6];
if (strncpy_s(dest, sizeof(dest), src, 5) == 0) {
dest[5] = '\0'; // Add null terminator just in case
printf("Substring: %s\n", dest);
} else {
printf("Copy error\n");
}
return 0;
}
3.3 strchr
untuk memotong hingga karakter tertentu
- Ukuran buffer () dapat ditentukan, sehingga dapat menyalin dengan aman.
destsz
n
Namun, strncpy_s
ditambahkan dalam standar C11, sehingga perlu diingat bahwa tidak dapat digunakan di beberapa lingkungan.
strchr
Struktur dasar
strchr
memungkinkan Anda menemukan posisi karakter tertentu dan mengambil string hingga bagian tersebut.
Contoh penggunaan
str
c
char
Poin penting
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *pos = strchr(str, ','); // Find the position of ','
if (pos != NULL) {
int length = pos - str; // Calculate the number of characters up to ','
char result[20];
strncpy(result, str, length);
result[length] = '\0'; // Add the null terminator
printf("Substring: %s\n", result); // Output "Hello"
}
return 0;
}
3.4 strstr
untuk pencarian kata kunci dan pemotongan
strchr
mengembalikan alamatc
yang pertama kali ditemukanpos - str
strncpy
strstr
Struktur dasar
strstr
berguna untuk mencari substring dan mengambil string setelahnya.
Contoh penggunaan
char *strstr(const char *haystack, const char *needle);
haystack
needle
Poin penting
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *pos = strstr(str, "World"); // Search for the position of "World"
if (pos != NULL) {
printf("Found substring: %s\n", pos);
} else {
printf("Substring not found.\n");
}
return 0;
}
3.5 Ringkasan
strstr
needle
NULL
needle
haystack
4. Cara Memotong Substring di Bahasa C【Bagian Fungsi Buatan】
strncpy
digunakan untuk menyalin substring dengan aman, namun Anda perlu menambahkan karakter null secara manual.strncpy_s
dapat menentukandestsz
dan meningkatkan keamanan.strchr
jika digunakan, dapat mengambil substring hingga karakter tertentu。strstr
jika digunakan, dapat mengambil posisi kata kunci tertentu, dan memotong dari sana.
Dengan memanfaatkan pustaka standar, Anda dapat mengimplementasikan pemrosesan string dalam bahasa C secara sederhana dan aman.
4.1 Manfaat Membuat Fungsi Buatan
Jika memanfaatkan pustaka standar, pemotongan substring dasar dapat dilakukan, tetapi dalam beberapa kasus diperlukan lebih fleksibel . Oleh karena itu, pada bagian ini kami menjelaskan tentang pemotongan substring menggunakan fungsi buatan sendiri.
4.2 Fungsi Dasar Ekstraksi Substring
Dengan menggunakan pustaka standar, Anda dapat menyalin dan mencari substring, tetapi ada masalah berikut.
strncpy
tidak menambahkan karakter null'\0'
secara otomatisstrchr
danstrstr
hanya dapat melakukan pencarian parsial- Manipulasi string yang lebih fleksibel sulit
Oleh karena itu, membuat fungsi buatan sendiri yang dapat disesuaikan dengan kebutuhan tertentu menjadi efektif.
Spesifikasi Fungsi
Pertama, buat fungsi dasar yang memotong string dari posisi yang ditentukan.
Kode Implementasi
- Parameter
const char *source
int start
int length
char *dest
- Isi Proses
start
length
dest
'\0'
Poin
#include <stdio.h>
#include <string.h>
void substring(const char *source, int start, int length, char *dest) {
int i;
for (i = 0; i < length && source[start + i] != '\0'; i++) {
dest[i] = source[start + i];
}
dest[i] = '\0'; // Add null terminator
}
int main() {
char text[] = "Hello, World!";
char result[10];
substring(text, 7, 5, result); // Extract "World"
printf("Substring: %s\n", result);
return 0;
}
4.3 Pengambilan substring dinamis menggunakan malloc
for
length
'\0'
dest[i] = '\0'; tambahkan
pastikan menempatkan karakter null di akhir
Spesifikasi Fungsi
Pada fungsi di atas, ukuran dest
harus dialokasikan sebelumnya. Namun, jika ukuran yang diperlukan dapat dialokasikan secara dinamis, fungsi tersebut menjadi lebih umum.
Kode Implementasi
- Alokasikan memori yang diperlukan
start
length
- Di pemanggil perlu dilakukan
Poin
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *substring_dynamic(const char *source, int start, int length) {
char *dest = (char *)malloc(length + 1); // +1 for the null terminator
if (dest == NULL) {
return NULL; // Memory allocation failed
}
int i;
for (i = 0; i < length && source[start + i] != '\0'; i++) {
dest[i] = source[start + i];
}
dest[i] = '\0';
return dest;
}
int main() {
char text[] = "Hello, World!";
char *result = substring_dynamic(text, 7, 5);
if (result != NULL) {
printf("Substring: %s\n", result);
free(result); // Free allocated memory
} else {
printf("Memory allocation failed.\n");
}
return 0;
}
4.4 Dukungan Karakter Multibita (Bahasa Jepang)
malloc
mengalokasikan memori secara dinamis- Setelah digunakan, Anda perlu melepaskan memori dengan .
Implementasi yang Mempertimbangkan Karakter Multibita
Ketika menangani bahasa Jepang (karakter multibita seperti UTF-8), satu karakter tidak selalu 1 byte , sehingga fungsi substring
sederhana tidak berfungsi dengan benar.
Kode Implementasi (Dukungan UTF-8)
mbstowcs
wchar_t
wcsncpy
wcstombs
Poin
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>
void substring_utf8(const char *source, int start, int length, char *dest) {
setlocale(LC_ALL, ""); // Set the locale
wchar_t wsource[256];
mbstowcs(wsource, source, 256); // Convert UTF-8 string to wide-character string
wchar_t wresult[256];
wcsncpy(wresult, wsource + start, length); // Extract substring in wide characters
wresult[length] = L'\0';
wcstombs(dest, wresult, 256); // Convert back to multibyte string
}
int main() {
char text[] = "こんにちは、世界!"; // UTF-8 string
char result[20];
substring_utf8(text, 5, 3, result); // Extract "世界"
printf("Substring: %s\n", result);
return 0;
}
4.5 Ringkasan
setlocale(LC_ALL, "");
mbstowcs
- Setelah mengambil substring dengan , konversi kembali ke multibyte dengan .
5. Metode Pemotongan String per Kode Karakter
substring
Jika Anda membuatnya sendiri, Anda dapat mengambil substring secara fleksibel。- Pengalokasian memori dinamis (
malloc
) memungkinkan pengambilan substring dengan ukuran variabel。 - Jika menangani karakter multibyte (Jepang),
mbstowcs
/wcstombs
gunakan.
Jika pustaka standar seperti strncpy
atau strchr
sulit diatasi, dengan membuat fungsi buatan sendiri, Anda dapat membuat pemrosesan string di bahasa C menjadi lebih kuat.
5.1 ASCII(karakter 1 byte)dalam kasus
Dalam C Gengo, Jika tidak memperhatikan perbedaan kode karakter, proses pemotongan string mungkin tidak berfungsi dengan benar hal ini dapat terjadi. Terutama, ketika menangani karakter multibita seperti bahasa Jepang (UTF-8, Shift_JIS, EUC-JP, dll.), karena 1 karakter ≠ 1 byte, fungsi sederhana seperti strncpy
atau substring
tidak dapat memproses dengan tepat.
Pada bagian ini, Metode Pemotongan String per Kode Karakter akan dijelaskan secara detail.
Pengambilan substring dasar
Contoh Implementasi
Karakter ASCII 1 karakter = 1 byte sehingga, strncpy
atau substring
dapat diproses dengan mudah.
5.2 UTF-8(karakter multibita)dalam kasus
#include <stdio.h>
#include <string.h>
void substring_ascii(const char *source, int start, int length, char *dest) {
strncpy(dest, source + start, length);
dest[length] = '\0'; // Add null terminator
}
int main() {
char text[] = "Hello, World!";
char result[6];
substring_ascii(text, 7, 5, result); // Extract "World"
printf("Substring: %s\n", result);
return 0;
}
Poin
- Jika teks ASCII (hanya alfanumerik) maka
strncpy
cukup dapat menangani '\0'
Selalu tambahkan (karakter null)
Karakteristik UTF-8
Metode Penanganan yang Benar
Pada UTF-8, jumlah byte per karakter 1-4 byte yang berubah-ubah, sehingga penggunaan sederhana strncpy
dapat menyebabkan pemotongan karakter di tengah.
Pengambilan substring yang mendukung UTF-8
Dalam C Gengo, untuk memproses UTF-8 dengan aman, mbstowcs
digunakan untuk mengonversi ke string lebar ( wchar_t
) dan metode mengambil substring disarankan.
5.3 Shift_JIS(karakter multibita)dalam kasus
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
void substring_utf8(const char *source, int start, int length, char *dest) {
setlocale(LC_ALL, ""); // Set the locale
wchar_t wsource[256];
mbstowcs(wsource, source, 256); // Convert multibyte string to wide-character string
wchar_t wresult[256];
wcsncpy(wresult, wsource + start, length); // Get the substring
wresult[length] = L'\0';
wcstombs(dest, wresult, 256); // Convert wide-character string back to multibyte
}
int main() {
char text[] = "こんにちは、世界!"; // UTF-8 string
char result[20];
substring_utf8(text, 5, 3, result); // Extract "世界"
printf("Substring: %s\n", result);
return 0;
}
Poin
setlocale(LC_ALL, "");
mbstowcs
wchar_t
wcsncpy
wcstombs
Karakteristik Shift_JIS
Pengambilan substring yang mendukung Shift_JIS
Pada Shift_JIS, 1 karakter dapat menjadi 1 byte atau 2 byte sehingga penggunaan sederhana strncpy
dapat menyebabkan karakter rusak.
Implementasi pada Shift_JIS
Bahkan dalam kasus Shift_JIS, metode mengonversi ke string lebar dan memprosesnya disarankan.
5.4 EUC-JP(karakter multibita)dalam kasus
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
void substring_sjis(const char *source, int start, int length, char *dest) {
setlocale(LC_ALL, "Japanese"); // Set locale to handle Shift_JIS
wchar_t wsource[256];
mbstowcs(wsource, source, 256); // Convert multibyte string (Shift_JIS) to wide-character string
wchar_t wresult[256];
wcsncpy(wresult, wsource + start, length); // Extract substring
wresult[length] = L'\0';
wcstombs(dest, wresult, 256); // Convert wide-character string back to multibyte (Shift_JIS)
}
int main() {
char text[] = "こんにちは、世界!"; // Shift_JIS string (depending on environment)
char result[20];
substring_sjis(text, 5, 3, result); // Extract "世界"
printf("Substring: %s\n", result);
return 0;
}
Poin
- Untuk memproses Shift_JIS dengan benar, Anda perlu diatur.
mbstowcs
wcstombs
Karakteristik EUC-JP
Pengambilan substring yang mendukung EUC-JP
EUC-JP, seperti Shift_JIS, karena jumlah byte per karakter berbeda, diperlukan proses konversi yang menggunakan karakter lebar .
5.5 Kesimpulan
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
void substring_eucjp(const char *source, int start, int length, char *dest) {
setlocale(LC_ALL, "ja_JP.eucJP"); // Set locale to handle EUC-JP
wchar_t wsource[256];
mbstowcs(wsource, source, 256); // Convert multibyte string (EUC-JP) to wide-character string
wchar_t wresult[256];
wcsncpy(wresult, wsource + start, length); // Extract substring
wresult[length] = L'\0';
wcstombs(dest, wresult, 256); // Convert wide-character string back to multibyte (EUC-JP)
}
int main() {
char text[] = "こんにちは、世界!"; // EUC-JP string (depending on environment)
char result[20];
substring_eucjp(text, 5, 3, result); // Extract "世界"
printf("Substring: %s\n", result);
return 0;
}
Poin
setlocale(LC_ALL, "ja_JP.eucJP");
mbstowcs
wcstombs
6. Cara Memisahkan String dengan Bahasa C
kode karakter | jumlah byte | Metode pemrosesan yang disarankan |
---|---|---|
ASCII | 1 byte | strncpy |
UTF-8 | 1-4 byte | mbstowcs wcstombs |
Shift_JIS | 1 atau 2 byte | mbstowcs wcstombs |
EUC-JP | 1 atau 2 byte | mbstowcs wcstombs |
- Jika hanya karakter ASCII
strncpy
OK - Jika menggunakan UTF-8, Shift_JIS, EUC-JP gunakan
mbstowcs
/wcstombs
gunakan - sesuai dengan lingkungan
setlocale(LC_ALL, \"...\");
mengatur dengan tepat
6.1 Memisahkan String dengan Menggunakan strtok
Proses pemisahan string, analisis data CSV, pemrosesan argumen baris perintah, analisis data log dll, diperlukan di banyak situasi. Dalam Bahasa C, ada cara menggunakan fungsi pustaka standar seperti strtok
dan strtok_r
, atau membuat fungsi buatan sendiri.
Pada bagian ini, kami akan menjelaskan secara detail tentang cara memisahkan string dengan karakter pemisah tertentu.
Syntax Dasar
strtok
adalah fungsi yang memisahkan string berdasarkan karakter pemisah yang ditentukan (delimiter).
Contoh Penggunaan: Memisahkan string dengan koma ,
char *strtok(char *str, const char *delim);
str
delim
- nilai kembali
- Catatan
strtok
'\0'
Hasil Eksekusi
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana,orange,grape"; // String to be split
char *token = strtok(str, ","); // Get the first token
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, ","); // Get the next token
}
return 0;
}
Catatan tentang strtok
token: apple
token: banana
token: orange
token: grape
6.2 Memisahkan String yang Thread-Safe dengan Menggunakan strtok_r
- Ubah string asli
strtok
karakter pemisah diubah menjadi'\0'
- tidak thread-safe
strtok
variabel statis global secara internal
Syntax Dasar
strtok_r
adalah versi thread-safe dari strtok
, dan menyimpan status ke dalam saveptr
sehingga dapat digunakan dengan aman di lingkungan multithread.
Contoh Penggunaan: Memisahkan string dengan spasi
char *strtok_r(char *str, const char *delim, char **saveptr);
str
delim
saveptr
Keuntungan strtok_r
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World from C"; // String to be split
char *token;
char *saveptr; // Pointer to store internal state
token = strtok_r(str, " ", &saveptr); // Get the first token
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok_r(NULL, " ", &saveptr); // Get the next token
}
return 0;
}
6.3 Memisahkan String dengan Fungsi Buatan Sendiri (tanpa menggunakan strtok
)
- thread-safe
- mampu memproses beberapa string secara paralel
Spesifikasi Fungsi Buatan Sendiri
strtok
mengubah string asli, sehingga memungkinkan untuk membuat fungsi buatan sendiri yang memisahkan string tanpa mengubahnya.
Kode Implementasi
- input
const char *source
const char delim
char tokens[][50]
- pemrosesan
source
delim
tokens
Hasil Eksekusi
#include <stdio.h>
#include <string.h>
void split_string(const char *source, char delim, char tokens[][50], int *count) {
int i = 0, j = 0, token_index = 0;
while (source[i] != '\0') {
if (source[i] == delim) {
tokens[token_index][j] = '\0';
token_index++;
j = 0;
} else {
tokens[token_index][j] = source[i];
j++;
}
i++;
}
tokens[token_index][j] = '\0';
*count = token_index + 1;
}
int main() {
char text[] = "dog,cat,bird,fish";
char tokens[10][50]; // Can store up to 10 words
int count;
split_string(text, ',', tokens, &count);
for (int i = 0; i < count; i++) {
printf("Token: %s\n", tokens[i]);
}
return 0;
}
Poin Penting
Token: dog
Token: cat
Token: bird
Token: fish
6.4 Aplikasi Pemisahan String (Pengolahan Data CSV)
source
tokens
Contoh Analisis Data CSV
Data CSV (dipisahkan dengan koma) dapat dianalisis menggunakan strtok
.
Hasil Eksekusi
#include <stdio.h>
#include <string.h>
int main() {
char csv[] = "Alice,24,Female\nBob,30,Male\nCharlie,28,Male"; // CSV data
char *line = strtok(csv, "\n"); // Process line by line
while (line != NULL) {
char *name = strtok(line, ",");
char *age = strtok(NULL, ",");
char *gender = strtok(NULL, ",");
printf("Name: %s, Age: %s, Gender: %s\n", name, age, gender);
line = strtok(NULL, "\n");
}
return 0;
}
6.5 Ringkasan
Name: Alice, Age: 24, Gender: Female
Name: Bob, Age: 30, Gender: Male
Name: Charlie, Age: 28, Gender: Male
Kesimpulan
Metode | keuntungan | kerugian |
---|---|---|
strtok | dapat dibagi dengan mudah | Ubah string asli |
strtok_r | thread-safe | Penggunaannya sedikit rumit |
fungsi buatan sendiri | Jangan ubah string asli | kode menjadi panjang |
Analisis CSV | Bermanfaat untuk pemrosesan data | strtok perhatikan batasannya |
7. Contoh aplikasi: Cara mengekstrak sebelum dan sesudah karakter tertentu
- Jika pembagian sederhana
strtok
- Jika multithreading
strtok_r
- Jika Anda tidak ingin mengubah aslinya, gunakan fungsi buatan sendiri
- Juga dapat diterapkan pada analisis data CSV
Pada bagian berikutnya, kami akan menjelaskan secara detail tentang 「Contoh Aplikasi: Cara Mengekstrak Karakter Sebelum dan Sesudah Karakter Tertentu」.
7.1 strchr
untuk mengambil string sebelum karakter tertentu
Dalam pemrosesan string, mengekstrak sebelum dan sesudah karakter atau kata kunci tertentu sering diperlukan. Misalnya, kasus seperti berikut dapat dipertimbangkan.
- Dapatkan hanya bagian domain dari URL
- Ekstrak nama file dari jalur file
- Mendapatkan string sebelum dan sesudah tag atau simbol tertentu
Dalam bahasa C, strchr
dan strstr
dapat digunakan untuk mewujudkan proses ini. Selain itu, bila diperlukan pemrosesan yang lebih fleksibel, membuat fungsi buatan sendiri juga efektif.
sintaks dasar
strchr
dapat digunakan untuk menentukan posisi karakter tertentu (yang pertama kali ditemukan).
contoh penggunaan: mengambil nama file dari path file
char *strchr(const char *str, int c);
str
c
char
strchr
mengembalikan alamatnya bila menemukan c
.
hasil eksekusi
#include <stdio.h>
#include <string.h>
void get_filename(const char *path, char *filename) {
char *pos = strrchr(path, '/'); // Search for the last '/'
if (pos != NULL) {
strcpy(filename, pos + 1); // Copy from the character after '/'
} else {
strcpy(filename, path); // If no '/', copy the whole path
}
}
int main() {
char path[] = "/home/user/documents/report.txt";
char filename[50];
get_filename(path, filename);
printf("Filename: %s\n", filename);
return 0;
}
poin
Filename: report.txt
7.2 strstr
untuk mengambil string setelah kata kunci tertentu
strrchr
karakter tertentu yang muncul terakhir (/
) posisi dapat diambilpos + 1
hanya nama file yang dapat diperoleh
sintaks dasar
strstr
dapat digunakan untuk mencari string tertentu (kata kunci) dan mengambil string setelah posisinya.
contoh penggunaan: mengambil domain dari URL
char *strstr(const char *haystack, const char *needle);
haystack
needle
strstr
mengembalikan alamat posisi bila menemukan needle
.
hasil eksekusi
#include <stdio.h>
#include <string.h>
void get_domain(const char *url, char *domain) {
char *pos = strstr(url, "://"); // Search for the position of "://"
if (pos != NULL) {
strcpy(domain, pos + 3); // Copy from the character after "://"
} else {
strcpy(domain, url); // If "://" is not found, copy the entire string
}
}
int main() {
char url[] = "https://www.example.com/page.html";
char domain[50];
get_domain(url, domain);
printf("Domain part: %s\n", domain);
return 0;
}
poin
Domain part: www.example.com/page.html
7.3 strchr
untuk memisahkan bagian sebelum dan sesudah karakter tertentu
strstr
"https://"
"http://"
"//"
pos + 3
://
contoh penggunaan: memisahkan nama pengguna dan domain dari alamat email
strchr
dapat dimanfaatkan untuk memisahkan dan mengambil string sebelum dan sesudah karakter tertentu.
hasil eksekusi
#include <stdio.h>
#include <string.h>
void split_email(const char *email, char *username, char *domain) {
char *pos = strchr(email, '@'); // Search for the position of '@'
if (pos != NULL) {
strncpy(username, email, pos - email); // Copy the part before '@'
username[pos - email] = '\0'; // Add null terminator
strcpy(domain, pos + 1); // Copy the part after '@'
}
}
int main() {
char email[] = "user@example.com";
char username[50], domain[50];
split_email(email, username, domain);
printf("Username: %s\n", username);
printf("Domain: %s\n", domain);
return 0;
}
poin
Username: user
Domain: example.com
7.4 Aplikasi: Mengekstrak atribut tertentu dalam tag HTML
strchr
'@'
strncpy
'@'
bagian sebelum, salin, dan tambahkan karakter nullstrcpy
'@'
bagian setelahnya salin
contoh penggunaan: <a href="URL">
untuk mengambil URL
Jika ingin mengambil atribut tertentu dari dalam tag HTML, strstr
dapat dimanfaatkan.
hasil eksekusi
#include <stdio.h>
#include <string.h>
void get_href(const char *html, char *url) {
char *start = strstr(html, "href=\""); // Search for the position of href="
if (start != NULL) {
start += 6; // Move past href="
char *end = strchr(start, '"'); // Search for the next "
if (end != NULL) {
strncpy(url, start, end - start);
url[end - start] = '\0'; // Add null terminator
}
}
}
int main() {
char html[] = "<a href=\"https://example.com\">Click Here</a>";
char url[100];
get_href(html, url);
printf("Extracted URL: %s\n", url);
return 0;
}
poin
Extracted URL: https://example.com
7.5 Ringkasan
strstr
"href=\"
strchr
"
Kesimpulan
Isi Proses | Menggunakan fungsi | keuntungan |
---|---|---|
Dapatkan sebelum karakter tertentu | strchr / strrchr | Sederhana dan cepat |
Dapatkan setelah karakter tertentu | strstr | Pencarian kata kunci memungkinkan |
Pisahkan sebelum dan sesudah karakter tertentu | strchr + strncpy | Berguna untuk pemisahan nama pengguna・domain dll |
Pengambilan atribut tag HTML | strstr + strchr | Dapat diterapkan pada web scraping |
8. Ringkasan
strchr
danstrstr
ketika memanfaatkan, dapat dengan mudah memperoleh sebelum dan sesudah karakter/kata kunci tertentu- Pengolahan jalur file, analisis URL, pemisahan alamat email, dan banyak lagi, sangat berguna dalam banyak situasi
- Juga dapat diterapkan pada proses lanjutan seperti web scraping
8.1 Meninjau Artikel
Dalam artikel ini, tentang cara memotong string dalam C Gengo secara detail dari dasar hingga aplikasi. Di sini, kami meninjau poin penting setiap bagian dan menyusun metode optimal berdasarkan kegunaan.
8.2 Metode Optimal Berdasarkan Kegunaan
Bagian | Konten | Poin penting |
---|---|---|
Dasar string bahasa C | Dalam bahasa C, string diperlakukan sebagai array , dan karakter akhir penting. | Saat menangani string, |
Pengambilan dengan pustaka standar | strncpy strchr | strncpy |
Ekstraksi dengan fungsi buatan sendiri | Buat fungsi fleksibel | malloc mengambil substring variabel panjang |
Pengolahan per kode karakter | Cara menangani UTF-8, Shift_JIS, EUC-JP | mbstowcs wcstombs konversi ke karakter lebar aman |
Metode pemisahan string | strtok strtok_r | strtok mengubah string asli |
Ekstrak sebelum dan sesudah karakter tertentu | strchr strstr | Pengambilan nama file, analisis URL, analisis HTML |
1. Memotong Substring
2. Membagi String
skenario penggunaan | Metode optimal |
---|---|
Saya ingin mendapatkan string dengan panjang tertentu. | strncpy or substring() |
Saya ingin melakukan pemotongan yang aman | strncpy_s |
Menangani karakter multibyte (UTF-8, Shift_JIS, EUC-JP) | mbstowcs / wcstombs |
3. Mengambil Sebelum dan Sesudah Karakter Tertentu
skenario penggunaan | Metode optimal |
---|---|
Saya ingin memisahkan string secara sederhana | strtok |
Saya ingin melakukan pemisahan yang thread-safe | strtok_r |
Saya ingin memisahkan tanpa mengubah string asli. | Fungsi buatan sendiri(split_string() ) |
8.3 Hal-hal yang Perlu Diperhatikan dalam Pemrosesan String C Gengo
skenario penggunaan | Metode terbaik |
---|---|
Dapatkan nama file dari jalur file | strrchr(path, '/') |
Dapatkan bagian domain dari URL | strstr(url, "://") |
Pisahkan nama pengguna dan domain dari alamat email | strchr(email, '@') |
Mengambil nilai atribut dari tag HTML | strstr(tag, "href=\"") + strchr(tag, '"') |
1. Menegakkan Pengelolaan Terminasi Null 'Contoh Penyalinan String Aman
'
Contoh Penyalinan String Aman
'2. Waspadai Buffer Overflow
Dalam pemrosesan string C Gengo, mengelola karakter terminasi ‘\0’ dengan tepat adalah hal yang paling penting. Khususnya saat menggunakan strncpy
atau strchr
, perhatikan untuk menambahkan karakter null secara manual.
3. Gunakan mbstowcs
untuk Memproses Karakter Multibyte
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[6];
strncpy(dest, src, 5);
dest[5] = '\0'; // Add null terminator for safety
printf("Substring: %s\n", dest);
return 0;
}
4. Pengelolaan Ukuran Buffer
Dalam operasi string C Gengo, perlu diimplementasikan dengan hati-hati agar tidak mengakses di luar batas array. Khususnya saat menggunakan strncpy
, penting untuk mengontrol jumlah byte yang disalin.
Contoh Penyalinan String Aman
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[6];
strncpy(dest, src, sizeof(dest) - 1);
dest[5] = '\0'; // Explicitly add null terminator
printf("Substring: %s\n", dest);
return 0;
}
8.4 Menuju Pembelajaran Lebih Lanjut
Jika menangani karakter multibyte seperti UTF-8 atau Shift_JIS, fungsi strncpy
atau strlen
tidak berfungsi dengan benar.
Oleh karena itu, ketika menangani karakter multibyte, disarankan untuk mengonversinya terlebih dahulu ke string lebar menggunakan mbstowcs
, lalu memprosesnya dengan tepat.
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, ""); // Set the locale
char text[] = "こんにちは、世界!"; // UTF-8
wchar_t wtext[256];
mbstowcs(wtext, text, 256); // Convert to wide-character string
printf("Converted wide-character string: %ls\n", wtext);
return 0;
}
Topik untuk Memperdalam Pembelajaran
Dalam pemrosesan string, penting untuk menghitung ukuran memori yang diperlukan sebelumnya dan mencegah overflow buffer. Khususnya saat menggunakan malloc
untuk mengalokasikan memori dinamis, pastikan ukuran yang tepat.
8.5 Ringkasan
Pemrosesan string C Gengo adalah keterampilan penting untuk meningkatkan keamanan dan keterbacaan program. Berdasarkan isi artikel ini, mempelajari topik berikut akan memungkinkan pemrosesan string yang lebih canggih.
Topik untuk Memperdalam Pembelajaran
- Ekspresi reguler (regex)
- Operasi file(pengolahan string menggunakan fgets, fscanf)
- Manajemen memori (pengolahan string dinamis menggunakan malloc, realloc)
- Analisis data (JSON, XML parsing methods)
8.5 Ringkasan
- String dalam bahasa C dikelola sebagai array
char
, sehingga penanganan karakter akhir'\0'
penting - Untuk memotong substring, gunakan
strncpy
,substring()
,malloc
gunakan - Untuk memisahkan string,
strtok
/strtok_r
/ gunakan fungsi buatan - Jika ingin mengambil karakter sebelum dan sesudah tertentu,
strchr
,strstr
gunakan - Jika menangani karakter multibyte (Jepang),
mbstowcs
gunakan - Berusahalah melakukan pengolahan string yang aman, dan perhatikan buffer overflow.
Jika Anda memanfaatkan isi artikel ini, pemrosesan string yang praktis dalam C Gengo menjadi memungkinkan. Setelah memahami fungsi dasar, tantang diri Anda dengan fungsi buatan sendiri dan pemrosesan lanjutan, sehingga dapat menulis kode yang lebih efisien!