Friday, December 23, 2016

Bab 7. Pemrograman C Belajar Dari Contoh



Bab. 7 Karakter dan String

Tujuan Instruksional
       ·         Dasar karakter dan string.
       ·         Pustakan penanganan-karakter.
       ·         Fungsi konversi string.
       ·         Fungsi pustaka masukan/keluaran.
       ·         Fungsi manipulasi-string.
·         Fungsi perbandingan pada pustaka penanganan-string.
·         Fungsi pencarian pada pustaka penanganan-string.
·         Fungsi memori pada pustaka penanganan-string.





7.1 Introduksi

Pada bab ini, akan dikenalkan fungsi-fungsi pustakan standar C yang memfasilitasi pemrosesan karakter dan string. Fungsi tersebut memampukan program untuk memproses karakter, string, baris teks, dan blok memori. Bab ini juga akan mendiskusikan beberapa teknik yang dipakai untuk mengembangkan editor, pengolah kata,  perangkat penata-letak halaman, dan perangkat lunak pemrosesan-teks lainnya. Manipulasi teks yang dilakukan oleh fungsi-fungsi masukan/keluaran terformat seperti printf dan scanf dapat diimplementasikan menggunakan fungsi-fungsi yang didiskusikan pada bab ini.

7.2 Dasar Karakter dan String
Karakter secara fundamental merupakan blok pembangun program sumber. Setiap program mengandung rentetan karakter yang, ketika dikelompokkan sedemikian rupa, diinterpretasikan oleh komputer sebagai serangkaian perintah yang dipakai dalam menuntaskan pekerjaan. Suatu program bisa memuat konstanta karakter. Konstanta karakter merupakan sebuah nilai int yang direpresentasikan sebagai karakter yang diapit oleh tanda kutip tunggal. Nilai suatu konstanta karakter adalah nilai integer dari karakter di dalam himpunan karakter mesin. Sebagai contoh, ‘z’ merepresentasikan nilai integer dari z, dan ‘\n’ adalah nilai integer dari karakter garis-baru (122 dan 10 di dalam ASCII).

String merupakan suatu runtun karakter yang diperlakukan sebagai unit tunggal. Sebuah string bisa memuat huruf, dijit, dan berbagai karakter spesial seperti +, -, *, /, dan $. Literal string atau konstanta string dalam C ditulis diapit dengan tanda kutip ganda sebagai berikut:

“Washington Siahaan” (nama)
“Jl. Balige No. 1”   (alamat jalan)
“Balige, Tobasa”     (kecamatan dan kabupaten)
“(0622) 346322”     (nomor telepon)

String dalam C merupakan array karakter yang diakhiri dengan karakter null (‘\0’). String diakses melalui pointer yang menunjuk ke karakter pertama di dalam string. Nilai suatu string adalah alamat dari karakter pertamanya. Jadi, dalam C, sangat tepat bila dikatakan bahwa string adalah sebuah pointer, yaitu pointer yang menunjuk ke karakter pertamanya. Pada kasus ini, string seperti array, karena array juga merupakan sebuah pointer yang menunjuk ke elemen pertamanya.
Array karakter atau variabel bertipe char * dapat diinisialisasi dengan sebuah string di dalam definisinya. Definisi

char warna[] = "biru";
const char *warnaPtr = " biru ";

masing-masing menginisialisasi sebuah variabel dengan string “biru”. Definisi pertama menciptakan sebuah array 5-elemen warna yang memuat karakter ‘b’, ‘i’, ‘r’, ‘u’, dan ‘\0’. Definisi kedua menciptakan variabel pointer warnaPtr yang menunjuk ke string “biru” di dalam memori.

Definisi array tersebut dapat pula dituliskan sebagai

char warna[] = { 'b', 'i', 'r', 'u', '\0' };

Ketika mendefinisikan suatu array karakter untuk memuat sebuah string, array tersebut harus cukup besar untuk menyimpan string dan karakter null sebagai penghenti. Definisi tersebut secara otomatis menentukan ukuran array berdasarkan jumlah penginisialisasi di dalam daftar penginsialisasi.

String dapat disimpan di dalam sebuah array menggunakan scanf. Sebagai contoh, statemen berikut menyimpan sebuah string di dalam array karakter kata[20]:

scanf( "%s", kata );

String yang dientrikan pengguna disimpan di dalam kata. Varaibel kata adalah sebuah array, yang tentu saja, sebuah pointer, jadi & tidak dibutuhkan dengan argumen kata. Ingat dari bagian 5.4 bahwa fungsi scanf akan membaca karakter demi karakter sampai ditemukan spasi, tab, garis-baru, atau indikatir enf-of-file. Jadi, adalah hal yang mungkin bahwa masukan pengguna akan melebihi 19 karakter dan bahwa program akan bermasalah! Karena alasan ini, direkomendasikan menggunakan penspesifikasi konversi %19s sehingga scanf hanya membaca sampai 19 karakter saja dan menyisakan karakter terakhir untuk karakter null penghenti. Ini akan mencegah scanf dari penulisan karakter ke dalam memori yang melebihi dari s. Bagi suatu array karakter yang akan ditampilkan sebagai sebuah string, array tersebut harus memuat karakter null penghenti.

7.3 Pustaka Penanganan-Karakter
Pustakan penanganan-karakter (<ctype.h>) menyertakan beberapa fungsi yang melakukan manipulasi dan pengujian terhadap data karakter. Setiap fungsi menerima sebuah karakter, yang direpresentasikan sebagai suatu int, atau sebuah EOF. Seperti yang didiskusikan pada Bab 3, karakter seringkali dimanipulasi sebagai integer, karena karakter di dalam C biasanya merupakan integer 1-byte. EOF memiliki nilai -1 dan beberapa arsitek perangkat keras tidak mengijinkan nilai negatif disimpan di dalam variabel char. Gambar 7.1 menyimpulkan beberapa fungsi pustaka penanganan-karakter.



Prototipe
Penjelasan
int isdigit( int c );

int isalpha( int c );

int isalnum( int c );


int isxdigit( int c );


int islower( int c );


int isupper( int c );


int tolower( int c );


int toupper( int c );


int isspace( int c );



int iscntrl( int c );


int ispunct( int c );


int isprint( int c );


int isgraph( int c );
Menghasilkan nilai balik true jik c adalah sebuah dijit dan 0 jika sebaliknya.

Menghasilkan nilai balik true jik c adalah sebuah huruf dan 0 jika sebaliknya.

Menghasilkan nilai balik true jik c adalah sebuah dijit atau huruf  dan 0 jika sebaliknya.

Menghasilkan nilai balik true jik c adalah sebuah dijit heksadesimal dan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c merupakan huruf kecil dan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c merupakan huruf besar dan 0 jika sebaliknya.

Jika c adalah huruf besar, tolower akan mengembalikan c sebagai huruf kecil. Sebaliknya, tolower membiarkan argumen tidak berubah.

Jika c adalah huruf kecil, toupper akan mengembalikan c sebagai huruf besar. Sebaliknya, toupper membiarkan argumen tidak berubah.

Menghasilkan nilai balik true jika c adalah karakter spasi, garis-baru (‘\n’), form feed (‘\f’), carriage return (‘\r’), tab horisontal (‘\t’), atau tab vertikal (‘\v’), dan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c adalah karakter kontrol dan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c adalah karakter printing selain spasi, dijit, dan huruf dan menghasilkan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c adalah karakter printing termasuk spasi dan menghasilkan 0 jika sebaliknya.

Menghasilkan nilai balik true jika c adalah karakter printing selain spasi dan menghasilkan 0 jika sebaliknya.

Fungsi isdigit, isalpha, isalnum, dan isxdigit
Gambar 7.2 mendemonstrasikan fungsi isdigit, isalpha, isalnum, dan isxdigit. Fungsi isdigit menentukan apakah argumennya sebuah dijit (0-9). Fungsi isalpha menentukan apakah argumennya merupakan sebuah huruf besar (A-Z) atau huruf kecil (a-z). Fungsi isalnum menentukan apakah argumennya sebuah huruf besar, huruf kecil, atau dijit. Fungsi isxdigit menentukan apakah argumennya adalah dijit heksadesimal (A-F, a-f, 0-9).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* Gambar 7.2: gambar07_02.c
   Menggunakan fungsi isdigit, isalpha, isalnum, dan isxdigit */
#include <stdio.h>
#include <ctype.h>

int main( void )
{
  printf( "%s\n%s%s\n%s%s\n\n", "Sesuai dengan isdigit: ",
    isdigit( '8' )? "8 adalah sebuah " : "8 bukan sebuah ", "dijit",
    isdigit( '#' )? "# adalah sebuah " : "# bukan sebuah ", "dijit" );

  printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n",
          "Sesuai dengan isalpha:",
    isalpha( 'A' )? "A adalah sebuah " : "A bukan sebuah ", "huruf",
    isalpha( 'b' )? "b adalah sebuah " : "b bukan sebuah ", "huruf",
    isalpha( '&' )? "& adalah sebuah " : "& bukan sebuah ", "huruf",
    isalpha( '4' )? "4 adalah sebuah " : "4 bukan sebuah ", "huruf" );

  printf( "%s\n%s%s\n%s%s\n%s%s\n\n",
          "Sesuai dengan isalnum:",
    isalnum( 'A' )? "A adalah sebuah " : "A bukan sebuah ",
    "dijit atau huruf",
    isalnum( '8' )? "8 adalah sebuah " : "8 bukan sebuah ",
    "dijit atau huruf",
    isalnum( '#' )? "# adalah sebuah " : "# bukan sebuah ",
    "dijit atau huruf" );

  printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n",
    "Sesuai dengan isxdigit:",
    isxdigit( 'F' )? "F adalah sebuah " : "F bukan sebuah ",
    "dijit heksadesimal",
    isxdigit( 'J' )? "J adalah sebuah " : "J bukan sebuah ",
    "dijit heksadesimal",
    isxdigit( '7' )? "7 adalah sebuah " : "7 bukan sebuah ",
    "dijit heksadesimal",
    isxdigit( '$' )? "$ adalah sebuah " : "$ bukan sebuah ",
    "dijit heksadesimal",
    isxdigit( 'f' )? "f adalah sebuah " : "f bukan sebuah ",
    "dijit heksadesimal" );
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


Sesuai dengan isdigit:
8 adalah sebuah dijit
# bukan sebuah dijit

Sesuai dengan isalpha:
A adalah sebuah huruf
b adalah sebuah huruf
& bukan sebuah huruf
4 bukan sebuah huruf

Sesuai dengan isalnum:
A adalah sebuah dijit atau huruf
8 adalah sebuah dijit atau huruf
# bukan sebuah dijit atau huruf

Sesuai dengan isxdigit:
F adalah sebuah dijit heksadesimal
J bukan sebuah dijit heksadesimal
7 adalah sebuah dijit heksadesimal
$ bukan sebuah dijit heksadesimal
f adalah sebuah dijit heksadesimal


Gambar 7.1 | Penggunaan fungsi isdigit, isalpha, isalnum, dan isxdigit.

Gambar 7.2 menggunakan operator kondisional (?:) untuk menentukan apakah string “adalah sebuah” atau string “bukan sebuah” ditampilkan pada keluaran untuk tiap karakter yang diuji. Sebagai contoh, ekspresi

isdigit( '8' ) ? "8 adalah sebuah " : "8 bukan sebuah "

mengindikasikan bahwa jika ‘8’ adalah sebuah dijit, maka string “8 adalah sebuah “ yang ditampilkan, dan jika ‘8’ tidak sebuah dijit (isdigit menghasilkan nilai balik 0), maka string “8 bukan sebuah “ yang ditampilkan.

Fungsi islower, isupper, tolower, dan toupper
Gambar 7.3 mendemonstrasikan fungsi islower, isupper, tolower, dan toupper. Fungsi islower menentukan apakah argumennya merupakah huruf kecil (a-z). Fungsi isupper menentukan apakah argumennya merupakan huruf besar (A-Z). Fungsi tolower mengkonversi huruf besar menjadi huruf kecil dan menghasilkan nilai balik berupa huruf kecil. Jika argumen tidak huruf besar, maka tolower menghasilkan nilai balik berupa argumen yang tidak berubah. Fungsi toupper mengkonversi huruf kecil menjadi huruf besar dan menghasilkan nilai balik berupa huruf besar. Jika argumen tidak huruf kecil, maka toupper menghasilkan nilai balik berupa argumen yang tidak berubah.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* Gambar 7.3: gambar07_03.c
   Menggunakan fungsi islower, isupper, tolower, toupper */
#include <stdio.h>
#include <ctype.h>

int main( void )
{
  printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n",
    "Sesuai dengan islower:",
    islower( 'p' )? "p adalah sebuah " : "p bukan sebuah ",
    "huruf kecil",
    islower( 'P' )? "P adalah sebuah " : "P bukan sebuah ",
    "huruf kecil",
    islower( '5' )? "5 adalah sebuah " : "5 bukan sebuah ",
    "huruf kecil",
    islower( '!' )? "! adalah sebuah " : "! bukan sebuah ",
    "huruf kecil" );

  printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n",
    "Sesuai dengan isupper:",
    isupper( 'D' )? "D adalah sebuah " : "D bukan sebuah ",
    "huruf besar",
    isupper( 'd' )? "d adalah sebuah " : "d bukan sebuah ",
    "huruf besar",
    isupper( '8' )? "8 adalah sebuah " : "8 bukan sebuah ",
    "huruf besar",
    isupper( '$' )? "$ adalah sebuah " : "$ bukan sebuah ",
    "huruf besar" );

  printf( "%s%c\n%s%c\n%s%c\n%s%c\n",
    "u dikonversi menjadi huruf besar adalah ", toupper( 'u' ),
    "7 dikonversi menjadi huruf besar adalah ", toupper( '7' ),
    "$ dikonversi menjadi hutuf besar adalah ", toupper( '$' ),
    "L dikonversi menjadi huruf kecil adalah ", tolower( 'L' ));
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


Sesuai dengan islower:
p adalah sebuah huruf kecil
P bukan sebuah huruf kecil
5 bukan sebuah huruf kecil
! bukan sebuah huruf kecil

Sesuai dengan isupper:
D adalah sebuah huruf besar
d bukan sebuah huruf besar
8 bukan sebuah huruf besar
$ bukan sebuah huruf besar

u dikonversi menjadi huruf besar adalah U
7 dikonversi menjadi huruf besar adalah 7
$ dikonversi menjadi hutuf besar adalah $
L dikonversi menjadi huruf kecil adalah l


Gambar 7.3 | Penggunaan fungsi fungsi islower, isupper, tolower, dan toupper

Fungsi isspace, iscntrl, ispunct, isprint, dan isgraph
Gamba 7.4 mendemonstrasikan fungsi isspace, iscntrl, ispunct, isprint, dan isgraph. Fungsi isspace menentukan jika sebuah karakter adalah salah satu dari karakter spasi-putih: spasi (‘ ‘), form feed (‘\f’), garis-baru (‘\n’), carriage return (‘\r’), tab horisontal (‘\t’), tab vertikal (‘\v’). Fungsi iscntrl menentukan jika sebuah karakter adalah salah satu dari karakter kontrol: tab horisontal (‘\t’), tab vertikal (‘\v’), form feed (‘\f’), alert (‘\a’), backspace (‘\b’), carriage return (‘\r’), atau garis-baru (‘\r’). Fungsi ispunct menentukan jika sebuah karakter adalah suatu karakter printing selain  spasi, dijit, atau huruf, seperti $, #, (, ), [, ], {, }, :, atau %. Fungsi isprint menentukan apakah sebuah karakter dapat ditampilkan pada layar (termasuk karakter spasi). Fungsi isgraph sama seperti isprint, kecuali bahwa karakter spasi tidak disertakan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* Gambar 7.4: gambar07_04.c
   Menggunakan fungsi isspace, iscntrl, ispunct, isprint, isgraph */
#include <stdio.h>
#include <ctype.h>

int main( void )
{
  printf( "%s\n%s%s%s\n%s%s%s\n%s%s\n\n",
    "Sesuai dengan isspace:",
    "Garis-baru", isspace( '\n' )? " adalah sebuah " : " bukan sebuah ",
    "karakter spasi-putih", "Tab horisontal",
    isspace( '\t' )? " adalah sebuah " : " bukan sebuah ",
    "karakter spasi-putih",
    isspace( '%' )? "% adalah sebuah " : "% bukan sebuah ",
    "karakter spasi-putih" );

  printf( "%s\n%s%s%s\n%s%s\n\n", "Sesuai dengan iscntrl:",
    "Garis-baru", iscntrl( '\n' )? " adalah sebuah " : " bukan sebuah ",
    "karakter kontrol", iscntrl( '$' )? "$ adalah sebuah " :
    "$ bukan sebuah ", "karakter kontrol" );

  printf( "%s\n%s%s\n%s%s\n%s%s\n\n",
    "Sesuai dengan ispunct:",
    ispunct( ';' )? "; adalah sebuah " : "; bukan sebuah ",
    "karakter pungtuasi",
    ispunct( 'Y' )? "Y adalah sebuah " : "Y bukan sebuah ",
    "karakter pungtuasi",
    ispunct( '#' )? "# adalah sebuah " : "# bukan sebuah ",
    "karakter pungtuasi" );

  printf( "%s\n%s%s\n%s%s%s\n\n", "Sesuai dengan isprint:",
    isprint( '$' )? "$ adalah sebuah " : "$ bukan sebuah ",
    "karakter printing",
    "Alert", isprint( '\a' )? " adalah sebuah " : " bukan sebuah ",
    "karakter printing" );

  printf( "%s\n%s%s\n%s%s%s\n", "Sesuai dengan isgraph:",
    isgraph( 'Q' )? "Q adalah sebuah " : "Q bukan sebuah ",
    "karakter printing selain spasi",
    "Spasi", isgraph( ' ' )? " adalah sebuah " : " bukan sebuah ",
    "karakter printing selain spasi" );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */



Sesuai dengan isspace:
Garis-baru adalah sebuah karakter spasi-putih
Tab horisontal adalah sebuah karakter spasi-putih
% bukan sebuah karakter spasi-putih

Sesuai dengan iscntrl:
Garis-baru adalah sebuah karakter kontrol
$ bukan sebuah karakter kontrol

Sesuai dengan ispunct:
; adalah sebuah karakter pungtuasi
Y bukan sebuah karakter pungtuasi
# adalah sebuah karakter pungtuasi

Sesuai dengan isprint:
$ adalah sebuah karakter printing
Alert bukan sebuah karakter printing

Sesuai dengan isgraph:
Q adalah sebuah karakter printing selain spasi
Spasi bukan sebuah karakter printing selain spasi


Gambar 7.4 | Penggunaan fungsi isspace, iscntrl, ispunct, isprint, dan isgraph

7.4 Fungsi Konversi String
Bagian ini akan menyajikan fungsi-fungsi konversi-string dari pustaka utilitas umum (<stdlib>). Semua fungsi ini mengkonversi string dijit ke integer dan ke nilai pecahan. Gambar 7.5 menyimpulkan semua fungsi konversi-string. Perhatikan bahwa kegunaan const dalam mendeklarasikan variabel nPtr di dalam header fungsi (dibaca dari kanan ke kiri sebagai “nPtr merupakan sebuah pointer yang menunjuk ke suatu konstanta karakter”); const menspesifikasi bahwa nilai argumen tidak akan dimodifikasi.

Prototipe
Penjelasan
double atof( const char *nPtr );

int atoi( const char *nPtr );

long atol( const char *nPtr );

double strtod( const char *nPtr, char **endPtr );

long strtol( const char *nPtr, char **endPtr, int base );

unsigned long strtoul( const char *nPtr, char **endPtr, int base );
Mengkonversi dari string nPtr menjadi double.

Mengkonversi dari string nPtr menjadi int.

Mengkonversi dari string nPtr menjadi long int.

Mengkonversi dari string nPtr menjadi double.



Mengkonversi dari string nPtr menjadi long.



Mengkonversi dari string nPtr menjadi unsigned long.

Gambar 7.5 | Fungsi konversi-string dari pustaka utilitas umum.

Fungsi atof
Fungsi atof (Gambar 7.6) mengkonversi argumennya, sebuah string yang merepresentasikan suatu angka titik-mengambang (pecahan), menjadi suatu nilai double. Fungsi ini menghasilkan nilai balik berupa nilai double. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atof menjadi tak-terdefinisi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 7.6: gambar07_06.c
   Menggunakan atof */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  double d; /* Variabel untuk menampung string terkonversi */

  d = atof( "99.0" );

  printf( "%s%.3f\n%s%.3f\n",
    "String \"99.0\" dikonversi menjadi double adalah ", d,
    "Nilai terkonversi dibagi dengan 2 menjadi ", d / 2.0 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String "99.0" dikonversi menjadi double adalah 99.000
Nilai terkonversi dibagi dengan 2 menjadi 49.500

Gambar 7.6 | Penggunaan fungsi atof

Fungsi atoi
Fungsi atoi (Gambar 7.7) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu angka integer, menjadi suatu nilai int. Fungsi ini menghasilkan nilai balik berupa nilai int. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atoi menjadi tak-terdefinisi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 7.7: gambar07_07.c
    Menggunakan atoi */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
 int i; /* variabel untuk menampung string terkonversi */

 i = atoi( "2593" );

 printf( "%s%d\n%s%d\n",
 "String \"2593\" dikonversi menjadi int adalah ", i,
 "Nilai terkonversi dikurangi dengan 593 menjadi ", i - 593 );
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


String "99.0" dikonversi menjadi double adalah 99.000
Nilai terkonversi dibagi dengan 2 menjadi 49.500

Gambar 7.7 | Penggunaan fungsi atoi

Fungsi atol
Fungsi atol (Gambar 7.8) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu angka integer yang panjang, menjadi suatu nilai long. Fungsi ini menghasilkan nilai balik berupa nilai long. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atol menjadi tak-terdefinisi. Jika int dan long keduanya disimpan dalam 4-byte, maka fungsi atoi dan atol akan menghasilkan keluaran yang identik.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 7.8: gambar07_08.c
   Menggunakan atol */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  long l; /* variabel untuk menampung string terkonversi */

  l = atol( "1000000" );

  printf( "%s%ld\n%s%ld\n",
    "String \"1000000\" dikonversi menjadi long int adalah ", l,
    "Nilai terkonversi dibagi dengan 2 menjadi ", l / 2 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String "1000000" dikonversi menjadi long int adalah 1000000
Nilai terkonversi dibagi dengan 2 menjadi 500000

Gambar 7.8 | Penggunaan fungsi atol

Fungsi strtod
Fungsi strtod (Gambar 7.0) mengkonversi runtun karakter yang merepresentasikan nilai pecahan menjadi double. Fungsi ini menerima dua argumen, yaitu sebuah string (char *) dan sebuah pointer yang menunjuk ke string (char **). String tersebut memuat runtun karakter yang akan dikonversi menjadi double. Pointer ditugaskan kepada lokasi dari karakter pertama setelah potongan terkonversi dari string. Baris 14

d = strtod( string, &stringPtr );

mengindikasikan bahwa d ditugaskan kepada nilai double yang dikonversi dari string, dan stringPtr ditugaskan ke lokasi dari karakter pertama setelah nilai terkonversi (51.2) di dalam string.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Gambar 7.9: gambar07_09.c
   Menggunakan strtod */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  /* menginisialisasi pointer strin */
  const char *string = "51.2% diperbolehkan"; /* menginisialisasi string */

  double d; /* variabel untuk menampung runtun terkonversi */
  char *stringPtr; /* menciptakan pointer char */

  d = strtod( string, &stringPtr );

  printf( "String \"%s\" dikonversi menjadi \n", string );
  printf( "nilai double %.2f dan string \"%s\"\n", d, stringPtr );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String "51.2% diperbolehkan" dikonversi menjadi
nilai double 51.20 dan string "% diperbolehkan"

Gambar 7.9 | Penggunaan fungsi strtod

Fungsi strtol
Fungsi strtol (Gambar 7.10) mengkonversi runtun karakter yang merepresentasikan nilai integer menjadi long. Fungsi ini menerima tiga argumen, yaitu sebuah string (char *), sebuah pointer yang menunjuk ke string (char **), dan sebuah integer. String tersebut memuat runtun karakter yang akan dikonversi menjadi long. Pointer ditugaskan kepada lokasi dari karakter pertama setelah potongan terkonversi dari string. Integer menspesifikasi nilai basis yang dipakai untuk konversi. Baris 13

x = strtol( string, &sisaPtr, 0 );

mengindikasikan bahwa x ditugasi nilai long yang dikonversi dari string. Argumen kedua, sisaPtr, ditugasi sisa dari string setelah konversi. Penggunaan NULL untuk argumen kedua menyebabkan sisa string diabaikan. Argumen ketiga, 0, mengindikasikan bahwa nilai yang akan dikonversi bisa dari berbasis oktal (basis 8), desimal (basis 10), atau heksadesimal (basis 16). Basis dapat dispesifikasi sebagai 0 atau sembarang nilai antara 2 dan 36. Sebagai contoh, nilai-nilai heksadesimal dapat memuat dijit 0-9 dan karakter A-F. Sebuah integer basis 11 dapat memuat dijit 0-9 dan karakter A. Integer basis 24 dapat memuat dijit 0-9 dan karakter A-N. Sebuah integer basis 36 dapat memuat dijit 0-9 dan karakter A-Z.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* Gambar 7.10: gambar07_10.c
   Menggunakan strtol */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  const char *string = "-1234567abc"; /* menginisialisasi string pointer */

  char *sisaPtr; /* menciptakan pointer char */
  long x; /* variabel untuk menampung runtun terkonversi */

  x = strtol( string, &sisaPtr, 0 );

  printf( "%s\"%s\"\n%s%ld\n%s\"%s\"\n%s%ld\n",
    "String asli adalah ", string,
    "Nilai terkonversi adalah ", x,
    "Sisa dari string asli adalah ",
     sisaPtr,
    "Nilai terkonversi dijumlahkan dengan 567 menjadi ", x + 567 );
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


String asli adalah "-1234567abc"
Nilai terkonversi adalah -1234567
Sisa dari string asli adalah "abc"
Nilai terkonversi dijumlahkan dengan 567 menjadi -1234000

Gambar 7.10 | Penggunaan fungsi strtol

Fungsi strtoul
Fungsi strtoul (Gambar 7.11) mengkonversi runtun karakter yang merepresentasikan sebuah integer unsigned long menjadi nilai unsigned long. Fungsi ini bekerja identik dengan fungsi strtol. Statemen

x = strtoul( string, &sisaPtr, 0 );

pada Gambar 7.11 mengindikasikan bahwa x ditugasi nilai unsigned long yang dikonversi dari string. Argumen kedua, &sisaPtr, ditugasi sisa string setelah konversi. Argumen ketiga, 0, mengindikasikan bahwa nilai yang akan dikonversi dapat dalam format oktal, desimal, atau heksadesimal.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Gambar 7.11: gambar07_11.c
 Menggunakan strtoul */
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  const char *string = "1234567abc"; /* menginisialisasi pointer string */
  unsigned long x; /* variabel untuk menampung runtun terkonversi */
  char *sisaPtr; /* menciptakan pointer char */

  x = strtoul( string, &sisaPtr, 0 );

  printf( "%s\"%s\"\n%s%lu\n%s\"%s\"\n%s%lu\n",
    "String asli adalah ", string,
    "Nilai terkonversi adalah ", x,
    "Sisa dari string asli adalah ",
    sisaPtr,
    "Nilai terkonversi dikurangi 567 menjadi ", x - 567 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String asli adalah "1234567abc"
Nilai terkonversi adalah 1234567
Sisa dari string asli adalah "abc"
Nilai terkonversi dikurangi 567 menjadi 1234000

Gambar 7.11 | Penggunaan fungsi strtoul

7.5 Fungsi Pustaka Masukan/Keluaran Standar
Bagian ini akan menyajikan beberapa fungsi dari pustaka masukan/keluaran standar (<stdio.h>) khusunya untuk memanipulasi karakter dan string. Gambar 7.12 menyimpulkan beberapa fungsi masukan/keluaran string dan karakter dari pustaka masukan/keluaran standar.

Prototipe
Penjelasan
int getchar( void );

char *fgets( char *s, int n, FILE *stream);


int putchar( int c );


int puts( const char *s );




int sprintf( char *s, const char *format, ... );



int sscanf( char *s, const char *format, ... );
Memasukkan karakter berikutnya dari masukan standar dan menghasilkan nilai balik berupa sebuah integer.

Memasukkan karakter-karakter dari aliran tertentu ke dalam array s sampai dijumpai karakter garis-baru atau enf-of-file atau sampai n-1 byte selesai terbaca.

Menampilkan karakter yang disimpan di dalam c dan mengembalikannya sebagai sebuah integer.

Menampilkan string s yang diikuti dengan sebuah karakter garis-baru. Menghasilkan nilai balik berupa integer tak-nol jika berhasil, atau EOF jika terjadi kegagalan.

Ekivalen dengan printf, kecuali bahwa keluaran disimpan di dalam array s, bukan ditampilkan pada layar. Menghasilkan nilai balik berupa jumlah karakter yang dituliskan ke dalam s, atau EOF jika terjadi error.

Akivalen dengan scanf, kecuali bahwa masukan dibaca dari array s, bukan dari papan-ketik. Menghasilkan nilai balik berupa jumlah item yang sukses terbaca oleh fungsi, atau EOF jika terjadi error.

Gambar 7.12 | Fungsi karakter dan string dari pustaka masukan/keluaran standar

Fungsi fgets dan putchar
Gambar 7.13 menggunakan fungsi fgets dan putchar untuk membaca sebaris teks dari masukan standar (papan-ketik) dan secara rekursif menampilkan karakter-karakter pada basis dengan urutan terbalik. Fungsi fgets membaca karakter demi karakter dari masukan standar ke dalam argumen pertamanya, sebuah array char, sampai ditemukan karakter garis-baru atau indikator end-of-file atau sampai jumlah karakter maksimum terlah terbaca. Jumlah karakter maksimum adalah lebih sedikit satu dari nilai yang ditentukan di dalam argumen kedua dari fungsi fgets. Argumen ketiga menspesifikasi aliran dari mana karakter dibaca, pada kasus ini, digunakan aliran masukan standar (stdin). Karakter null (‘\0’) disambungkan ke dalam array char (argumen pertama). Fungsi putchar menampilkan argumen karakternya. Program memanggil fungsi rekursif balik untuk menampilkan sebaris teks dengan gaya mundur. Jika karakter pertama dari array yang diterima oleh balik adalah karakter null ‘\0’, maka fungsi balik akan memberikan nilai balik. Sebaliknya, balik dipanggil kembali dengan alamat subarray dimulai dari elemen s[1], dan karakter s[0] ditampilkan dengan putchar ketika pemanggilan rekursif selesai dilakukan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* Gambar 7.13: gambar07_13.c
   Menggunakan fungsi gets dan putchar */
#include <stdio.h>

void balik( const char * const sPtr ); /* prototipe */

int main( void )
{
  char kalimat[ 80 ]; /* menciptakan array char */

  printf( "Masukkan sebaris teks:\n" );

  /* menggunakan fgets untuk membaca sebaris teks */
  fgets( kalimat, 80, stdin );

  printf( "\nBaris teks ditampilkan terbalik adalah:\n" );
  balik( kalimat );
  return 0; /* indikasi terminasi sukses */
 } /* akhir main */

/* menampilkan karakter secara rekursif dengan urutan terbalik */
void balik( const char * const sPtr )
{
  /* jika akhir dari string */
  if ( sPtr[ 0 ] == '\0' ) { /* kasus basis */
    return;
  } /* akhir if */
  else { /* jika tidak akhir string */
    balik( &sPtr[ 1 ] ); /* langkah rekursif */
    putchar( sPtr[ 0 ] ); /* menggunakan putchar untuk menampilkan karakter */
  } /* akhir else */
} /* akhir fungsi balik */


Masukkan sebaris teks:
Teknik Elektro Universitas Gadjah Mada

Baris teks ditampilkan terbalik adalah:
adaM hajdaG satisrevinU ortkelE kinkeT


Masukkan sebaris teks:
Teknik Elektro UNRAM

Baris teks ditampilkan terbalik adalah:
MARNU ortkelE kinkeT

Gambar 7.13 | Penggunaan fungsi gets dan putchar

Fungsi getchar dan puts
Gambar 7.14 menggunakan fungsi getchar dan puts dalam membaca karakter demi karakter dari masukan standar ke dalam array karakter kalimat dan menampilkan array karakter tersebut sebagai sebuah string. Fungsi getchar membaca sebuah karakter dari masukan standar dan menghasilkan nilai balik berupa integer (dari karakter tersebut). Fungsi puts mengambil sebuah string (char *) sebagai argumen dan menampilkan string tersebut diikuti dengan karakter garis-baru. Program berhenti membaca karakter ketika getchar membaca karakter garis-baru yang dimasukkan pengguna untuk mengakhiri baris teks. Karakter null disambungkan ke dalam array kalimat (baris 19) sehingga array tersebut diperlakukan sebagai sebuah string. Kemudian, fungsi puts menampilkan string yang dimuat di dalam kalimat.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* Gambar 7.14: gambar07_14.c
   Menggunakan fungsi getchar dan puts */
#include <stdio.h>

int main( void )
{
  char c; /* variabel untuk menampung karakter yang dimasukkan pengguna */
  char kalimat[ 80 ]; /* menciptakan array char */
  int i = 0; /* menginisialisasi kounter i */

  /* mendesak pengguna memasukkan sebaris teks */
  puts( "Masukkan sebaris teks:" );

  /* menggunakan getchar untuk membaca setiap karakter */
  while ( ( c = getchar() ) != '\n') {
    kalimat[ i++ ] = c;
  } /* akhir while */

  kalimat[ i ] = '\0'; /* menghentikan string */

  /* menggunakan puts untuk menampilkan kalimat */
  puts( "\nBaris teks yang dimasukkan adalah:" );
  puts( kalimat );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Masukkan sebaris teks:
Pematang Siantar

Baris teks yang dimasukkan adalah:
Pematang Siantar

Gambar 7.14 | Menggunakan getchar dan puts

Fungsi sprintf
Gambar 7.15 menggunakan fungsi sprintf dalam menampilkan data terformat ke dalam array s (array karakter). Fungsi ini menggunakan penspesifikasi konversi yang sama seperti printf. Program membaca sebuah nilai int dan nilai double untuk diformat dan ditampilkan ke dalam array s. Array s adalah argumen pertama dari sprintf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Gambar 7.15: gambar07_15.c
   Menggunakan sprintf */
#include <stdio.h>

int main( void )
{
  char s[ 80 ]; /* menciptakan array char */
  int x; /* nilai x yang akan dibaca */
  double y; /* nilai y yang akan dibaca */

  printf( "Masukkan sebuah integer dan sebuah double:\n" );
  scanf( "%d%lf", &x, &y );

  sprintf( s, "integer:%6d\ndouble:%8.2f", x, y );

  printf( "%s\n%s\n",
          "Keluaran terformat disimpan di dalam array s adalah:", s );
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


Masukkan sebuah integer dan sebuah double:
23 45.76
Keluaran terformat disimpan di dalam array s adalah:
integer:    23
double:   45.76

Gambar 7.15 | Menggunakan sprintf

Fungsi sscanf
Gambar 7.16 menggunakan fungsi sscanf dalam membaca data terformat dari karakter array s. Fungsi ini menggunakan penspesifikasi konversi yang sama dengan scanf. Program membaca sebuah int dan sebuah double dari array s dan menyimpannya di dalam x dan y. Nilai dari x dan y kemudian ditampilkan. Array s adalah argumen pertama dari sscanf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 17.16: gambar07_16.c
   Menggunakan sscanf */
#include <stdio.h>

int main( void )
{
  char s[] = "31298 87.375"; /* menginisialisasi array s */
  int x; /* nilai x yang akan dibaca */
  double y; /* nilai yang akan dibaca */

  sscanf( s, "%d%lf", &x, &y );
  printf( "%s\n%s%6d\n%s%8.3f\n",
          "Nilai-nilai yang disimpan di dalam array karakter s adalah:",
          "integer:", x, "double:", y );
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


Nilai-nilai yang disimpan di dalam array karakter s adalah:
integer: 31298
double:  87.375

Gambar 7.16 | Menggunakan sscanf

7.6 Fungsi Pemanipulasi String dari Pustaka Penanganan-String
Pustakan penanganan-string (<string.h>) menyediakan banyak fungsi yang berguna dalam memanipulasi data string (menyalin string dan menyambung string), membandingkan string, mencari karakter dan substring di dalam string, mentokenkan string (memisahkan string menjadi potongan-potongan logis), dan menentukan panjang string. Bagian ini akan menyajikan fungsi-fungsi pemanipulasian string dari pustaka penanganan-string. Semua fungsi tersebut disimpulkan pada Gambar 7.17. Setiap fungsi, kecuali strncpy, menempelkan karakter null ke dalam hasilnya.


Prototipe
Penjelasan
char *strcpy( char *s1, const char *s2 )

char *strncpy( char *s1, const char *s2, size_t n )

char *strcat( char *s1, const char *s2 )



char *strncat( char *s1, const char *s2, size_t n )

Menyalin string s2 ke dalam array s1. Nilai dari s1 dijadikan nilai balik.

Menyalin paling banyak n buah karakter dari string s2 ke dalam array s1. Nilai dari s1 dijadikan nilai balik.

Menyambung atau menempelkan string s2 ke dalam array s1. Karakter pertama dari s2 menindih karakter null penghenti dari s1. Nilai dari s1 dijadikan nilai balik.

Menyambung sebanyak n karakter dari string s2 ke dalam array s1. Karakter pertama dari s2 menindih karakter null penghenti dari s1. Nilai dari s1 dijadikan nilai balik.

Gambar 7.17 | Semua fungsi pemanipulasi string dari pustaka penanganan-string

Fungsi strncpy dan strncat menspesifikasi sebuah parameter bertipe size_t, yang merupakan tipe yang didefinisikan oleh standar C sebagai tipe integral dari nilai yang dijadikan nilai balik oleh operator sizeof.

Fungsi strcpy menyalin argumen keduanya (sebuah string) ke dalam argumen pertamanya (sebuah array karakter yang harus cukup besar untuk menampung string dan karakter null penghenti, yang juga disalin). Fungsi strncpy ekivalen dengan strcpy, kecuali bahwa strncpy menspesifikasi jumlah karakter yang akan disalin dari string ke dalam array. Fungsi strncpy tidak harus menyalin karakter null penghenti dari argumen keduanya. Karakter null penghenti hanya disalin jika jumlah karakter yang akan disalin sedikitnya satu lebih panjang dari panjang string. Misalnya, jika “test” adalah argumen kedua, maka karakter null penghenti akan disalin hanya jika argumen ketiga pada fungsi strncpy sedikitnya bernilai 5 (empat karakter untuk “test” ditambah dengan karakter null penghenti). Jika argumen ketiga lebih besar dari 5, maka karakter null akan ditempelkan ke dalam array sampai total jumlah karakter yang dispesifikasi oleh argumen ketiga ditulis.

Fungsi strcpy dan strncpy
Gambar 7.18 menggunakan strcpy untuk menyalin keseluruhan string di dalam array x ke dalam array y dan menggunakan strncpy untuk menyalin 14 karakter pertama array x ke dalam array z.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* Gambar 17.18: gambar07_18.c
   Menggunakan strcpy dan strncpy */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char x[] = "Selamat Ulang Tahun Untukmu"; /* menginisialisasi array char x*/
  char y[ 25 ]; /* menciptakan array char y */
  char z[ 15 ]; /* menciptakan array char z */

  /* menyalin dari x ke y */
  printf( "%s%s\n%s%s\n",
          "String di dalam array x adalah: ", x,
          "String di dalam array y adalah: ", strcpy( y, x ) );

  /* menyalin 14 karakter pertama dari x ke z.
     Tidak menyalin karakter null */
  strncpy( z, x, 14 );
  z[ 14 ] = '\0'; /* menghentikan string di dalam z */
  printf( "String di dalam array z adalah: %s\n", z );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String di dalam array x adalah: Selamat Ulang Tahun Untukmu
String di dalam array y adalah: Selamat Ulang Tahun Untukmu
String di dalam array z adalah: Selamat Ulang

Gambar 7.18 | Menggunakan strcpy dan strncpy

Fungsi strcat dan strncat
Fungsi strcat menyambungkan argumen keduanya (sebuah string) ke dalam argumen pertamanya (sebuah array karakter yang memuat string). Karakter pertama dari argumen kedua menggantikan karakter null (‘\0’) yang menghentikan string di dalam argumen pertama. Anda harus memastikan bahwa array yang digunakan untuk menyimpan string pertama harus cukup besar dalam menyimpan string pertama,  string kedua, dan karakter null penghenti yang disalin dari string kedua. Fungsi strncat menyambungkan sejumlah karakter dari string kedua ke dalam string pertama. Karakter null penghenti secara otomatis ditempelkan ke dalam hasil. Gambar 7.19 mendemonstrasikan fungsi strcat dan strncat.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* Gambar 7.19: gambar07_19.c
    Menggunakan strcat dan strncat */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char s1[ 20 ] = "Selamat "; /* menginisialisasi array char s1 */
  char s2[] = "Ulang Tahun "; /* menginisialisasi array char s2 */
  char s3[ 40 ] = " "; /* menginisialisasi array char s3 */

  printf( "s1 = %s\ns2 = %s\n", s1, s2 );

  /* menyambungkan s2 ke dalam s1 */
  printf( "strcat( s1, s2 ) = %s\n", strcat( s1, s2 ));

  /* menyambungkan 16 karakter pertama dari s1 ke dalam s3. Menempatkan '\0'
     setelah karakter terakhir */
  printf( "strncat( s3, s1, 8 ) = %s\n", strncat( s3, s1, 8 ) );

  /* Menyambungkan s1 ke dalam s3 */
  printf( "strcat( s3, s1 ) = %s\n", strcat( s3, s1 ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


s1 = Selamat
s2 = Ulang Tahun
strcat( s1, s2 ) = Selamat Ulang Tahun
strncat( s3, s1, 8 ) = Selamat
strcat( s3, s1 ) = Selamat Selamat Ulang Tahun

Gambar 7.19 | Menggunakan strcat dan strncat

7.7 Fungsi Perbandingan Dari Pustaka Penanganan-String
Bagian ini menyajikan beberapa fungsi perbandingan-string dari pustaka penanganan-string, yaitu fungsi strcmp dan strncmp. Gambar 7.20 memuat kedua prototipe dan penjelasan singkat atas masing-masing fungsi.

Prototipe
Penjelasan
int strcmp( const char *s1, const char *s2 );


int strncmp( const char *s1, const char *s2, size_t n );

Membandingkan string s1 dengan string s2. Fungsi ini menghasilkan nilai balik 0, kurang dari 0, atau lebih besar dari 0 jika s1 sama dengan s2, kurang dari s2, atau lebih dari s2.

Membandingkan sampai dengan n buah karakter dari string s1 dengan string s2. Fungsi ini menghasilkan nilai balik 0, kurang dari 0, atau lebih dari 0 jika s1 sama dengan s2, kurang dari s2, atau lebih dari s2.

Gambar 7.20 | Fungsi perbandingan-string dari pustaka penanganan-string

Gambar 7.21 membandingkan tiga string menggunakan strcmp dan strncmp. Fungsi strcmp membandingkan argumen string pertamanya dengan argumen string keduanya, karakter demi karakter. Fungsi ini menghasilkan nilai balik 0 jika kedua string sama, nilai balik negatif jika string pertama kurang dari string kedua, dan nilai balik positif jika string pertama lebih dari string kedua. Fungsi strncmp ekivalen dengan strcmp, kecuali bahwa strncmp membandingkan sampai sejumlah karakter yang telah ditentukan. Fungsi strncmp tidak membandingkan karakter setelah karakter null di dalam string. Program menampilkan nilai integer yang dijadikan nilai balik oleh setiap pemanggilan fungsi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* Gambar 7.21: gambar07_21.c
    Menggunakan strcmp dan strncmp */
#include <stdio.h>
#include <string.h>

int main( void )
{
  const char *s1 = "Selamat Ulang Tahun"; /* menginisialisasi pointer char */
  const char *s2 = "Selamat Tahun Baru"; /* menginisialisasi pointer char */
  const char *s3 = "Selamat Berlibur"; /* menginisialisasi pointer char */

  printf("%s%s\n%s%s\n%s%s\n\n%s%2d\n%s%2d\n%s%2d\n\n",
         "s1 = ", s1, "s2 = ", s2, "s3 = ", s3,
         "strcmp(s1, s2) = ", strcmp( s1, s2 ),
         "strcmp(s1, s3) = ", strcmp( s1, s3 ),
         "strcmp(s3, s1) = ", strcmp( s3, s1 ));

  printf("%s%2d\n%s%2d\n%s%2d\n",
         "strncmp(s1, s3, 6) = ", strncmp( s1, s3, 6 ),
         "strncmp(s1, s3, 7) = ", strncmp( s1, s3, 7 ),
         "strncmp(s3, s1, 7) = ", strncmp( s3, s1, 7 ));
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


s1 = Selamat Ulang Tahun
s2 = Selamat Tahun Baru
s3 = Selamat Berlibur

strcmp(s1, s2) =  1
strcmp(s1, s3) =  1
strcmp(s3, s1) = -1

strncmp(s1, s3, 6) =  0
strncmp(s1, s3, 7) =  0
strncmp(s3, s1, 7) =  0

Gambar 7.21 | Menggunakan strcmp dan strncmp

7.8 Fungsi Pencarian Dari Pustaka Penanganan-String
Bagian ini menyajikan fungsi-fungsi dari pustaka penanganan-string untuk mencari karakter dan string lainnya (substring) di dalam suatu string. Semua fungsi dimaksud disimpulkan pada Gambar 7.22. Fungsi strcpsn dan strspn menghasilkan nilai balik bertipe size_t.

Prototipe
Penjelasan
char *strchr( const char *s, int c );




size_t strcspn( const char *s1, const char *s2 );


size_t strspn( const char *s1, const char *s2 );


char *strpbrk( const char *s1, const char *s2 );




char *strrchr( const char *s, int c );




char *strstr( const char *s1, const char *s2 );


char *strtok( char *s1, const char *s2 );
Mencari lokasi kemunculan pertama dari karakter c dalam string s. Jika c ditemukan, maka sebuah pointer ke c di dalam s dijadikan nilai balik. Sebaliknya, sebuah pointer NULL dijadikan nilai balik.

Menentukan dan menjadikan nilai balik berupa panjang awal segmen dari string s1 yang memuat karakter-karakter yang tidak dimuat di dalam string s2.

Menentukan dan menjadikan nilai balik berupa panjang awal segmen dari string s1 yang memuat karakter-karakter yang dimuat di dalam string s2.

Mencari lokasi kemunculan pertama di dalam string s1 atas sembarang karakter di dalam string s2. Jika sebuah karakter dari string s2 ditemukan, maka suatu pointer yang menunjuk ke karakter tersebut di dalam string s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik.

Mencari lokasi dari kemunculan akhir dari c di dalam string s. Jika c ditemukan, maka sebuah pointer yang menunjuk ke c di dalam string s dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik.

Mencari lokasi kemunculan akhir di dalam string s1 atas string s2. Jika string dimaksud ditemukan, maka sebuah pointer yang menunjuk ke string di dalam s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik.

Runtun pemanggilan terhadap strtok memecah string s1 menjadi beberapa token, yaitu beberapa potongan logis seperti kata di dalam sebaris teks yang dipisahkan oleh karakter-karakter yang dimuat di dalam string s2. Pemanggilan pertama memuat s1 sebagai argumen pertama, dan pemanggilan selanjutnya menokenkan string sama yang memuat NULL sebagai argumen pertama. Sebuah pointer yang menunjuk ke token sekarang dijadikan nilai balik pada setiap pemanggilan. Jika tidak ada lagi token ketika fungsi dipanggil, NULL dijadikan nilai balik.

Gambar 7.22 | Fungsi pemanipulasi-string dari pustaka penanganan-string

Fungsi strchr
Fungsi strchr mencari kemunculan pertama dari suatu karakter di dalam sebuah string. Jika karakter dimaksud ditemukan, maka strchr menghasilkan nilai balik berupa sebuah pointer yang menunjuk ke karakter tersebut di dalam string; sebaliknya, strchr menghasilkan NULL. Gambar 7.23 menggunakan strchr untuk mencari kemunculan pertama dari ‘a dan ‘z’ di dalam string “Ambon Manise”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Gambar 7.23: gambar07_23.c
   Menggunakan strchr */
#include <stdio.h>
#include <string.h>

int main( void )
{
  const char *string = "Ambon Manise"; /* menginisialisasi pointer char */
  char karakter1 = 'a'; /* menginisialisasi karakter1 */
  char karakter2 = 'z'; /* menginisialisasi karakter2 */

  /* jika karakter1 ditemukan di dalam string */
  if ( strchr( string, karakter1 ) != NULL ) {
    printf( "\'%c\' ditemukan di dalam \"%s\".\n",
      karakter1, string );
  } /* akhir if */
  else { /* jika karakter1 tidak ditemukan */
    printf( "\'%c\' tidak ditemukan di dalam \"%s\".\n",
      karakter1, string );
  } /* akhir else */

  /* jika karakter2 ditemukan di dalam string */
  if ( strchr( string, karakter2 ) != NULL ) {
    printf( "\'%c\' ditemukan di dalam \"%s\".\n",
      karakter2, string );
  } /* akhir if */
  else { /* jika karakter2 tidak ditemukan */
    printf( "\'%c\' tidak ditemukan di dalam \"%s\".\n",
      karakter2, string );
  } /* akhir else */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */


'a' ditemukan di dalam "Ambon Manise".
'z' tidak ditemukan di dalam "Ambon Manise".

Gambar 7.23 | Menggunakan strchr

Fungsi strcspn
Fungsi strcspn (Gambar 7.24) menentukan panjang awal segmen dari string di dalam argumen pertamanya yang tidak memuat sembarang karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan nilai balik berupa panjang segmen tersebut.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Gambar7.24: gambar07_24.c
   Menggunakan strcspn */
#include<stdio.h>
#include<string.h>

int main( void )
{
  /* menginisialisasi dua pointer char */
  const char *string1 = "Nilai sebesar 3.14159";
  const char *string2 = "1234567890";

  printf( "%s%s\n%s%s\n\n%s\n%s%u\n",
          "string1 = ", string1, "string2 = ", string2,
          "Panjang segmen awal dari string1",
          "yang tidak memuat sembarang karakter dari string2 = ",
  strcspn( string1, string2 ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


string1 = Nilai sebesar 3.14159
string2 = 1234567890

Panjang segmen awal dari string1
yang tidak memuat sembarang karakter dari string2 = 14

Gambar 7.24 | Menggunakan strcspn

Fungsi strpbrk
Fungsi strpbrk mencari lokasi kemunculan pertama di dalam string s1 atas sembarang karakter di dalam string s2. Jika sebuah karakter dari string s2 ditemukan, maka suatu pointer yang menunjuk ke karakter tersebut di dalam string s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik. Gambar 7.25 menunjukkan sebuah program yang mencari lokasi kemunculan pertama di dalam string string1 atas sembarang karakter di dalam string string2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 7.25: gambar07_25.c
   Menggunakan strpbrk */
#include <stdio.h>
#include <string.h>

int main( void )
{
  const char *string1 = "Ini adalah ujian"; /* menginisialisasi pointer char */
  const char *string2 = "berhati-hatilah"; /* menginisialisasi pointer char */

  printf( "%s\"%s\"\n'%c'%s\n\"%s\"\n",
          "Dari semua karakter di dalam ", string2,
           *strpbrk( string1, string2 ),
          " muncul pertama kali di dalam ", string1 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Dari semua karakter di dalam "berhati-hatilah"
'i' muncul pertama kali di dalam
"Ini adalah ujian"

Gambar 7.25 | Menggunakan strpbrk

Fungsi strrchr
Fungsi strrchr mencari lokasi dari kemunculan akhir dari c di dalam string s. Jika c ditemukan, maka sebuah pointer yang menunjuk ke c di dalam string s dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik. Gambar 7.26 menampilkan sebuah program yang mencari kemunculan terakhir dari karakter ‘z’ di dalam string “Kebung binatang banyak zebra”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Gambar 7.26: gambar07_26.c
   Menggunakan strrchr */
#include <stdio.h>
#include <string.h>

int main( void )
{
  /* menginisialisasi pointer char */
  const char *string1 = "Kebun binatang banyak zebra";

  int c = 'z'; /* karakter yang akan dicari */

  printf( "%s\n%s'%c'%s\"%s\"\n",
          "Sisa dari string1 yang dimulai dengan",
          "kemunculan akhir dari karakter ", c,
          " adalah: ", strrchr( string1, c ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Sisa dari string1 yang dimulai dengan
kemunculan akhir dari karakter 'z' adalah: "zebra"

Gambar 7.26 | Menggunakan strrch

Fungsi strspn
Fungsi strspn (Gambar 7.27) menentukan panjang dari segmel awal pada string di dalam argumen pertamanya yang hanya memuat karakter-karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan panjang segmen sebagai nilai balik.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Gambar 7.27: gambar07_27.c
   Menggunakan strspn */
#include <stdio.h>
#include <string.h>

int main( void )
{
  /* menginisialisasi dua pointer char */
  const char *string1 = "Nilai sebesar 3.14159";
  const char *string2 = "raseb ilN";

  printf( "%s%s\n%s%s\n\n%s\n%s%u\n",
          "string1 = ", string1, "string2 = ", string2,
          "Panjang dari segmen awal dari string1",
          "yang hanya memuat karakter-karakter dari string2 = ",
           strspn( string1, string2 ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


string1 = Nilai sebesar 3.14159
string2 = raseb ilN

Panjang dari segmen awal dari string1
yang hanya memuat karakter-karakter dari string2 = 14

Gambar 7.27 | Menggunakan strspn

Fungsi strstr
Fungsi strstr mencari lokasi kemunculan akhir di dalam string s1 atas string s2. Jika string dimaksud ditemukan, maka sebuah pointer yang menunjuk ke string di dalam s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik. Gambar 7.28 menggunakan strstr untuk mencari string “def” di dalam string “abcdefabcdef”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Gambar 7.28: gambar07_28.c
   Menggunakan strstr */
#include <stdio.h>
#include <string.h>

int main( void )
{
  const char *string1 = "abcdefabcdef"; /* string tempat pencarian */
  const char *string2 = "def"; /* string yang akan dicari */

 printf( "%s%s\n%s%s\n\n%s\n%s%s\n",
         "string1 = ", string1, "string2 = ", string2,
         "Sisa dari string1 yang diawali dengan",
         "kemunculan pertama dari string2 adalah: ",
         strstr( string1, string2 ));
return 0; /* indikasi terminasi sukses */
} /* akhir main */


string1 = abcdefabcdef
string2 = def

Sisa dari string1 yang diawali dengan
kemunculan pertama dari string2 adalah: defabcdef

Gambar 7.28 | Menggunakan strstr

Fungsi strtok
Fungsi strtok (Gambar 7.29) dipakai untuk memecah string s1 menjadi beberapa token, yaitu beberapa potongan logis seperti kata di dalam sebaris teks yang dipisahkan oleh karakter-karakter yang dimuat di dalam string s2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* Gambar 7.29: gambar07_29.c
   Menggunakan strtok */
#include <stdio.h>
#include <string.h>

int main( void )
{
  /* menginisialisasi array string */
  char string[] = "Ini adalah sebuah kalimat dengan 7 token";
  char *tokenPtr; /* menciptakan pointer char */

  printf( "%s\n%s\n\n%s\n",
          "String yang akan ditokenkan adalah:", string,
          "Semua token adalah:" );

  tokenPtr = strtok( string, " " ); /* mulai menokenkan kalimat */

  /* berlanjut menokenkan kalimat sampai tokenPtr menjadi NULL */
  while ( tokenPtr != NULL ) {
    printf( "%s\n", tokenPtr );
    tokenPtr = strtok( NULL, " " ); /* mendapatkan token berikutnya */
  } /* akhir while */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String yang akan ditokenkan adalah:
Ini adalah sebuah kalimat dengan 7 token

Semua token adalah:
Ini
adalah
sebuah
kalimat
dengan
7
token

Gambar 7.29 | Menggunakan strtok

Prototipe
Penjelasan
void *memcpy( void *s1, const void *s2, size_t n );


void *memmove( void *s1, const void *s2, size_t n );





int memcmp( const void *s1, const void *s2, size_t n );


void *memchr( const void *s, int c, size_t n );



void *memset( void *s, int c, size_t n );
Menyalin sejumlah n karakter dari objek yang ditunjuk oleh s2 ke dalam objek yang ditunjuk oleh s1. Pointer yang menunjuk ke objek yang dihasilkan dijadikan nilai balik.

Menyalin sejumlah n karakter dari objek yang ditunjuk oleh s2 ke dalam objek yang ditunjuk oleh s1. Penyalinan dilakukan dengan cara menyalin karakter-karakter dari objek yang ditunjuk oleh s2 ke dalam suatu array temporer dan kemudian dari array temporer tersebut ke dalam objek yang ditunjuk oleh s1. Pointer yang menunjuk ke objek yang dihasilkan dijadikan nilai balik.

Membandingkan  sejumlah n karakter pertama dari objek yang ditunjuk oleh s1 dan objek yang ditunjuk oleh s2. Fungsi ini menghasilkan 0, kurang dari 0, dan lebih dari 0 jika s1 sama dengan, kurang dari, atau lebih dari s2.

Mencari lokasi kemunculan pertama dari c (dikonversi dari unsigned char) di dalam n karakter pertama pada objek yang ditunjuk oleh s. Jik c ditemukan, maka sebuah pointer yang menunjuk ke c di dalam objek dijadikan nilai balik. Sebaliknya, NULL dijadikan nilai balik.

Menyalin c (dikonversi dari unsigned char) ke dalam n karakter pertama pada objek yang ditunjuk oleh s. Sebuah pointer yang menunjuk ke hasil dijadikan nilai balik.

Gambar 7.30 | Fungsi memori dari pustaka penanganan-string

Fungsi memcpy
Fungsi memcpy sejumlah n karakter dari objek yang ditunjuk oleh s2 ke dalam objek yang ditunjuk oleh s1. Pointer yang menunjuk ke objek yang dihasilkan dijadikan nilai balik. Fungsi ini dapat menerima sebuah pointer dengan sembarang tipe objek. Hasil dari fungsi ini tidak terdefinisi jika dua objek saling tumpang-tindih di dalam memori (misalnya, keduanya merupakan bagian dari objek yang sama). Pada kasus seperti itu, digunakan memmove. Gambar 7.31 menggunakan memcpy untuk menyalin string di dalam array s2 ke dalam array s1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Gambar 7.31: gambar07_31.c
   Menggunakan memcpy */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char s1[ 20 ]; /* menciptakan array char s1 */
  char s2[] = "Menyalin string ini"; /* menginisialisasi array char s2 */

  memcpy( s1, s2, 20 );
  printf( "%s\n%s\"%s\"\n",
          "Setelah s2 disalin ke s1 dengan,",
          "s1 memuat ", s1 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Setelah s2 disalin ke s1 dengan,
s1 memuat "Menyalin string ini"

Gambar 7.31 | Menggunakan memcpy



Fungsi memmove
Fungsi memmove, seperti memcpy, menyalin sejumlah tertentu byte dari objek yang ditunjuk oleh argumen keduanya ke dalam objek yang ditunjuk oleh argumen pertamanya. Penyalinan dilakukan dengan cara byte demi byte disalin dari argumen kedua ke dalam suatu array karakter temporer, kemudian dari array temporer tersebut disalin ke argumen pertama. Gambar 7.32 menggunakan memmove dalam menyalin 10 byte terakhir dari array x ke dalam 10 byte pertama pada array x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Gambar 7.32: gambar07_32.c
   Menggunakan memmove */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char x[] = "HOME SWEET HOME"; /* menginisialisasi array char x */

  printf( "%s%s\n", "String di dalam array x sebelum memmove adalah: ", x );
  printf( "%s%s\n", "String di dalam array x setelah memmove adalah: ",
  memmove( x, &x[ 5 ], 10 ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


String di dalam array x sebelum memmove adalah: HOME SWEET HOME
String di dalam array x setelah memmove adalah: SWEET HOME HOME

Gambar 7.32 | Menggunakan memmove

Fungsi memcmp
Fungsi memcmp (Gambar 7.33) membandingkan  sejumlah karakter tertentu dari objek argumen pertamanya dan sejumlah karakter dari argumen keduanya. Fungsi ini menghasilkan 0, kurang dari 0, dan lebih dari 0 jika argumen pertamanya sama dengan, kurang dari, atau lebih dari argumen keduanya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Gambar 7.33: gambar07_33.c
 Menggunakan memcmp */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char s1[] = "ABCDEFG"; /* menginisialisasi array char s1 */
  char s2[] = "ABCDXYZ"; /* menginisialisasi array char s2 */

  printf( "%s%s\n%s%s\n\n%s%2d\n%s%2d\n%s%2d\n",
          "s1 = ", s1, "s2 = ", s2,
          "memcmp( s1, s2, 4 ) = ", memcmp( s1, s2, 4 ),
          "memcmp( s1, s2, 7 ) = ", memcmp( s1, s2, 7 ),
          "memcmp( s2, s1, 7 ) = ", memcmp( s2, s1, 7 ));
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


s1 = ABCDEFG
s2 = ABCDXYZ

memcmp( s1, s2, 4 ) =  0
memcmp( s1, s2, 7 ) = -1
memcmp( s2, s1, 7 ) =  1

Gambar 7.33 | Menggunakan memcmp

Fungsi memchr
Fungsi memchr mencari kemunculan pertama dari sebuah byte, yang direpresentasikan sebagai unsigned char, di dalam sejumlah byte tertentu pada suatu objek. Jika byte ditemukan, maka sebuah pointer yang menunjuk ke byte dimaksud di dalam objek dijadikan nilai balik; sebaliknya, pointer NULL dijadikan nilai balik. Gambar 7.34 menjadi karakter (byte) ‘r’ di dalam string “Ini adalah sebuah string”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Gambar 7.34: gambar07_34.c
   Menggunakan memchr */
#include <stdio.h>
#include <string.h>

int main( void )
{
  const char *s = "Ini adalah sebuah string"; /* menginisialisasi pointer char */

  printf( "%s\'%c\'%s\"%s\"\n",
          "Sisa dari s setelah karakter ", 'r',
          " ditemukan adalah ", memchr( s, 'r', 24 ));
 return 0; /* indikasi terminasi sukses */
} /* akhir main */


Sisa dari s setelah karakter 'r' ditemukan adalah "ring"

Gambar 7.34 | Menggunakan memchr

Fungsi memset
Fungsi memset menyalin nilai byte di dalam argumen keduanya ke dalam n byte pertama dari objek yang ditunjuk oleh argumen pertamanya, dimana n dispesifikasi oleh argumen ketiga. Gambar 7.35 menggunakan memset untuk menyalin ‘b’ ke dalam 7 byter pertama pada string1.

1
2
3
4
5
6
7
8
9
10
11
12
13
/* Gambar 7.35: gambar07_35.c
   Menggunakan memset */
#include <stdio.h>
#include <string.h>

int main( void )
{
  char string1[ 15 ] = "BBBBBBBBBBBBBB"; /* menginisialisasi string1 */

  printf( "string1 = %s\n", string1 );
  printf( "string1 setelah memset = %s\n", memset( string1, 'b', 7 ));
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


string1 = BBBBBBBBBBBBBB
string1 setelah memset = bbbbbbbBBBBBBB

Gambar 7.35 | Menggunakan memset


Kesimpulan
§  Karakter secara fundamental merupakan blok pembangun program sumber. Setiap program mengandung rentetan karakter yang, ketika dikelompokkan sedemikian rupa, diinterpretasikan oleh komputer sebagai serangkaian perintah yang dipakai dalam menuntaskan pekerjaan. Suatu program bisa memuat konstanta karakter. Konstanta karakter merupakan sebuah nilai int yang direpresentasikan sebagai karakter yang diapit oleh tanda kutip tunggal. Nilai suatu konstanta karakter adalah nilai integer dari karakter di dalam himpunan karakter mesin.

§  String merupakan suatu runtun karakter yang diperlakukan sebagai unit tunggal. Sebuah string bisa memuat huruf, dijit, dan berbagai karakter spesial seperti +, -, *, /, dan $. Literal string atau konstanta string dalam C ditulis diapit dengan tanda kutip ganda.

§   String dalam C merupakan array karakter yang diakhiri dengan karakter null (‘\0’). String diakses melalui pointer yang menunjuk ke karakter pertama di dalam string. Nilai suatu string adalah alamat dari karakter pertamanya.

§  Pustakan penanganan-karakter (<ctype.h>) menyertakan beberapa fungsi yang melakukan manipulasi dan pengujian terhadap data karakter. Setiap fungsi menerima sebuah karakter, yang direpresentasikan sebagai suatu int, atau sebuah EOF.

§  Fungsi isalpha menentukan apakah argumennya merupakan sebuah huruf besar (A-Z) atau huruf kecil (a-z). Fungsi isalnum menentukan apakah argumennya sebuah huruf besar, huruf kecil, atau dijit. Fungsi isxdigit menentukan apakah argumennya adalah dijit heksadesimal (A-F, a-f, 0-9).

§  Fungsi isupper menentukan apakah argumennya merupakan huruf besar (A-Z). Fungsi tolower mengkonversi huruf besar menjadi huruf kecil dan menghasilkan nilai balik berupa huruf kecil. Jika argumen tidak huruf besar, maka tolower menghasilkan nilai balik berupa argumen yang tidak berubah. Fungsi toupper mengkonversi huruf kecil menjadi huruf besar dan menghasilkan nilai balik berupa huruf besar. Jika argumen tidak huruf kecil, maka toupper menghasilkan nilai balik berupa argumen yang tidak berubah.

§  Fungsi isspace menentukan jika sebuah karakter adalah salah satu dari karakter spasi-putih: spasi (‘ ‘), form feed (‘\f’), garis-baru (‘\n’), carriage return (‘\r’), tab horisontal (‘\t’), tab vertikal (‘\v’). Fungsi iscntrl menentukan jika sebuah karakter adalah salah satu dari karakter kontrol: tab horisontal (‘\t’), tab vertikal (‘\v’), form feed (‘\f’), alert (‘\a’), backspace (‘\b’), carriage return (‘\r’), atau garis-baru (‘\r’). Fungsi ispunct menentukan jika sebuah karakter adalah suatu karakter printing selain  spasi, dijit, atau huruf, seperti $, #, (, ), [, ], {, }, :, atau %. Fungsi isprint menentukan apakah sebuah karakter dapat ditampilkan pada layar (termasuk karakter spasi). Fungsi isgraph sama seperti isprint, kecuali bahwa karakter spasi tidak disertakan.

§  Fungsi atof (Gambar 7.6) mengkonversi argumennya, sebuah string yang merepresentasikan suatu angka titik-mengambang (pecahan), menjadi suatu nilai double. Fungsi ini menghasilkan nilai balik berupa nilai double. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atof menjadi tak-terdefinisi.

§  Fungsi atoi (Gambar 7.7) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu angka integer, menjadi suatu nilai int. Fungsi ini menghasilkan nilai balik berupa nilai int. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atoi menjadi tak-terdefinisi.

§  Fungsi atol (Gambar 7.8) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu angka integer yang panjang, menjadi suatu nilai long. Fungsi ini menghasilkan nilai balik berupa nilai long. Jika nilai terkonversi tidak dapat direpresentasikan, misalnya, karena karakter pertama dari string adalah sebuah huruf, maka watak fungsi atol menjadi tak-terdefinisi. Jika int dan long keduanya disimpan dalam 4-byte, maka fungsi atoi dan atol akan menghasilkan keluaran yang identik.

§  Fungsi strtod (Gambar 7.0) mengkonversi runtun karakter yang merepresentasikan nilai pecahan menjadi double. Fungsi ini menerima dua argumen, yaitu sebuah string (char *) dan sebuah pointer yang menunjuk ke string (char **). String tersebut memuat runtun karakter yang akan dikonversi menjadi double. Pointer ditugaskan kepada lokasi dari karakter pertama setelah potongan terkonversi dari string.

§  Fungsi strtol (Gambar 7.10) mengkonversi runtun karakter yang merepresentasikan nilai integer menjadi long. Fungsi ini menerima tiga argumen, yaitu sebuah string (char *), sebuah pointer yang menunjuk ke string (char **), dan sebuah integer. String tersebut memuat runtun karakter yang akan dikonversi menjadi long. Pointer ditugaskan kepada lokasi dari karakter pertama setelah potongan terkonversi dari string. Integer menspesifikasi nilai basis yang dipakai untuk konversi.

§  Fungsi strtoul (Gambar 7.11) mengkonversi runtun karakter yang merepresentasikan sebuah integer unsigned long menjadi nilai unsigned long. Fungsi ini bekerja identik dengan fungsi strtol.

§  Fungsi fgets membaca karakter demi karakter dari masukan standar ke dalam argumen pertamanya, sebuah array char, sampai ditemukan karakter garis-baru atau indikator end-of-file atau sampai jumlah karakter maksimum terlah terbaca. Jumlah karakter maksimum adalah lebih sedikit satu dari nilai yang ditentukan di dalam argumen kedua dari fungsi fgets. Argumen ketiga menspesifikasi aliran dari mana karakter dibaca, pada kasus ini, digunakan aliran masukan standar (stdin). Karakter null (‘\0’) disambungkan ke dalam array char (argumen pertama).

§  Fungsi putchar menampilkan argumen karakternya. Program memanggil fungsi rekursif balik untuk menampilkan sebaris teks dengan gaya mundur. Jika karakter pertama dari array yang diterima oleh balik adalah karakter null ‘\0’, maka fungsi balik akan memberikan nilai balik. Sebaliknya, balik dipanggil kembali dengan alamat subarray dimulai dari elemen s[1], dan karakter s[0] ditampilkan dengan putchar ketika pemanggilan rekursif selesai dilakukan.

§  Fungsi getchar membaca sebuah karakter dari masukan standar dan menghasilkan nilai balik berupa integer (dari karakter tersebut). Fungsi puts mengambil sebuah string (char *) sebagai argumen dan menampilkan string tersebut diikuti dengan karakter garis-baru.

§  Fungsi strcpy menyalin argumen keduanya (sebuah string) ke dalam argumen pertamanya (sebuah array karakter yang harus cukup besar untuk menampung string dan karakter null penghenti, yang juga disalin). Fungsi strncpy ekivalen dengan strcpy, kecuali bahwa strncpy menspesifikasi jumlah karakter yang akan disalin dari string ke dalam array. Fungsi strncpy tidak harus menyalin karakter null penghenti dari argumen keduanya. Karakter null penghenti hanya disalin jika jumlah karakter yang akan disalin sedikitnya satu lebih panjang dari panjang string.

§  Fungsi strcat menyambungkan argumen keduanya (sebuah string) ke dalam argumen pertamanya (sebuah array karakter yang memuat string). Karakter pertama dari argumen kedua menggantikan karakter null (‘\0’) yang menghentikan string di dalam argumen pertama. Anda harus memastikan bahwa array yang digunakan untuk menyimpan string pertama harus cukup besar dalam menyimpan string pertama,  string kedua, dan karakter null penghenti yang disalin dari string kedua. Fungsi strncat menyambungkan sejumlah karakter dari string kedua ke dalam string pertama. Karakter null penghenti secara otomatis ditempelkan ke dalam hasil.

§  Fungsi strcmp membandingkan argumen string pertamanya dengan argumen string keduanya, karakter demi karakter. Fungsi ini menghasilkan nilai balik 0 jika kedua string sama, nilai balik negatif jika string pertama kurang dari string kedua, dan nilai balik positif jika string pertama lebih dari string kedua. Fungsi strncmp ekivalen dengan strcmp, kecuali bahwa strncmp membandingkan sampai sejumlah karakter yang telah ditentukan. Fungsi strncmp tidak membandingkan karakter setelah karakter null di dalam string.

§  Fungsi strchr mencari kemunculan pertama dari suatu karakter di dalam sebuah string. Jika karakter dimaksud ditemukan, maka strchr menghasilkan nilai balik berupa sebuah pointer yang menunjuk ke karakter tersebut di dalam string; sebaliknya, strchr menghasilkan NULL.

§  Fungsi strcspn menentukan panjang awal segmen dari string di dalam argumen pertamanya yang tidak memuat sembarang karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan nilai balik berupa panjang segmen tersebut.

§  Fungsi strpbrk mencari lokasi kemunculan pertama di dalam string s1 atas sembarang karakter di dalam string s2. Jika sebuah karakter dari string s2 ditemukan, maka suatu pointer yang menunjuk ke karakter tersebut di dalam string s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik.

§  Fungsi strspn menentukan panjang dari segmel awal pada string di dalam argumen pertamanya yang hanya memuat karakter-karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan panjang segmen sebagai nilai balik.

§  Fungsi strstr mencari lokasi kemunculan akhir di dalam string s1 atas string s2. Jika string dimaksud ditemukan, maka sebuah pointer yang menunjuk ke string di dalam s1 dijadikan nilai balik. Sebaliknya, pointer NULL dijadikan nilai balik.

§  Fungsi strtok dipakai untuk memecah string s1 menjadi beberapa token, yaitu beberapa potongan logis seperti kata di dalam sebaris teks yang dipisahkan oleh karakter-karakter yang dimuat di dalam string s2.

§  Fungsi memcpy sejumlah n karakter dari objek yang ditunjuk oleh s2 ke dalam objek yang ditunjuk oleh s1. Pointer yang menunjuk ke objek yang dihasilkan dijadikan nilai balik. Fungsi ini dapat menerima sebuah pointer dengan sembarang tipe objek. Hasil dari fungsi ini tidak terdefinisi jika dua objek saling tumpang-tindih di dalam memori (misalnya, keduanya merupakan bagian dari objek yang sama).

§  Fungsi memmove, seperti memcpy, menyalin sejumlah tertentu byte dari objek yang ditunjuk oleh argumen keduanya ke dalam objek yang ditunjuk oleh argumen pertamanya. Penyalinan dilakukan dengan cara byte demi byte disalin dari argumen kedua ke dalam suatu array karakter temporer, kemudian dari array temporer tersebut disalin ke argumen pertama.

§  Fungsi memcmp membandingkan  sejumlah karakter tertentu dari objek argumen pertamanya dan sejumlah karakter dari argumen keduanya. Fungsi ini menghasilkan 0, kurang dari 0, dan lebih dari 0 jika argumen pertamanya sama dengan, kurang dari, atau lebih dari argumen keduanya.

§  Fungsi memchr mencari kemunculan pertama dari sebuah byte, yang direpresentasikan sebagai unsigned char, di dalam sejumlah byte tertentu pada suatu objek. Jika byte ditemukan, maka sebuah pointer yang menunjuk ke byte dimaksud di dalam objek dijadikan nilai balik; sebaliknya, pointer NULL dijadikan nilai balik.

§  Fungsi memset menyalin nilai byte di dalam argumen keduanya ke dalam n byte pertama dari objek yang ditunjuk oleh argumen pertamanya, dimana n dispesifikasi oleh argumen ketiga.

Soal
1)       Apa yang ditampilkan, jika ada, ketika setiap statemen C berikut dieksekusi? Jika statemen memuat error, deskripsikan kesalahannya dan tunjukkan bagaimana mengoreksinya. Asumsikan definisi variabel berikut: char s1[ 50 ] = "aurora", s2[ 50 ] = " adam", s3[ 50 ], *sptr;
a) printf( "%c%s", toupper( s1[ 0 ] ), &s1[ 1 ] );
b) printf( "%s", strcpy( s3, s2 ) );
c) printf( "%s", strcat( strcat( strcpy( s3, s1 ), " and " ), s2 ) );
d) printf( "%u", strlen( s1 ) + strlen( s2 ) );
e) printf( "%u", strlen( s3 ) );

2)       Temukan kesalahan di dalam masing-masing segmen program berikut dan jelaskan bagaimana mengoreksinya:
a) char s[ 10 ];
   strncpy( s, "hallo", 5 );
   printf( "%s\n", s );
b) printf( "%s", 'a' );
c) char s[ 12 ];
   strcpy( s, "Selamat Datang" );
d) if ( strcmp( string1, string2 ) ) {
     printf( "String sama\n" );
   }

3)       Tulislah suatu program yang membaca sebuah karakter dari papan-ketik dan uji karakter tersebut dengan setiap fungsi di dalam pustaka penanganan-karakter. Program harus menampilkan nilai balik dari setiap fungsi.

4)       Tulislah sebuah program yang membaca sebaris teks ke dalam sebuah array char, s[100]. Tampilkan baris teks tersebut dalam huruf besar dan dalam huruf kecil.

5)       Tulislah sebuah program yang membaca empat string yang merepresentasikan integer, konversi string tersebut menjadi integer, jumlahkan semua nilainya, dan kemudian tampilkan total dari keempat nilai tersebut.

6)       Tulislah sebuah program yang membaca empat string yang merepresentasikan nilai pecahan, konversi string tersebut menjadi double, jumlahkan semua nilainya, dan kemudian tampilkan total dari keempat nilai tersebut.

7)       Tulislah sebuah program yang menggunakan fungsi strcmp untuk membandingkan dua string yang dimasukkan oleh pengguna. Program harus menguji keadaan apakah string pertama kurang dari, sama dengan, atau lebih dari string kedua.

8)       Tulislah sebuah program yang menggunakan fungsi strncmp untuk untuk membandingkan dua string yang dimasukkan oleh pengguna. Program harus membaca jumlah karakter yang akan dibandingkan, kemudian menampilkan apakah string pertama kurang dari, sama dengan, atau lebih dari string kedua.

9)       Tulislah dua versi atas tiap fungsi penyambungan-string dan penyalinan-string pada Gambar 7.17. Versi pertama harus menggunakan pensubskriptan array, dan versi kedua harus menggunakan pointer dan aritmatika pointer.

10)   Tulislah versi Anda sendiri atas fungsi getchar, putchar, dan puts pada Gambar 712.

11)   Tulislah dua versi atas tiap fungsi perbandingan-string pada Gambar 7.20. Versi pertama harus menggunakan pensubskriptan array, dan versi kedua harus menggunakan pointer dan aritmatika pointer.

12)   Tulislah versi Anda sendiri atas setiap fungsi pada Gambar 7.22 untuk pencarian string.
















No comments:

Post a Comment