Skip to content

Instantly share code, notes, and snippets.

@roktas
Created October 13, 2011 11:44
Show Gist options
  • Save roktas/1284037 to your computer and use it in GitHub Desktop.
Save roktas/1284037 to your computer and use it in GitHub Desktop.
/*
* Dizgideki karakterler hakkında bilgi görüntüle.
*
* HATALI sürüm: geniş karakter desteği olmayan işlevlerle çalışılıyor.
*/
#include <stdio.h>
#include <string.h>
int
main(int argc, char **argv)
{
char *p;
int i;
if (argc < 2) {
printf("Kullanım: %s <dizgi>\n", argv[0]);
return 1;
}
printf("Dizgi: \"%s\".\n", argv[1]);
for (p = argv[1], i = 0; *p ; p++)
printf("#%d konumundaki karakter \"%c\"\n", ++i, *p);
return 0;
}
/*
* Dizgideki karakterler hakkında bilgi görüntüle.
*/
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
wchar_t *wp;
int i, n, len;
/*
* C90'da değişken uzunluklu diziler yasak, C99'da tamam. GCC ile
* derlerken uyarı almamak için -std=c99 anahtarını kullanın.
*/
char p[MB_CUR_MAX+1];
/*
* Yereli etkinleştirerek dar karakterlerin kodlama bilgisini al. Ancak
* bu sayede mbs* işlevleri doğru çalışır. Geniş karakterlerle
* çalışırken daima bu işlemle başlamalıyız.
*/
setlocale(LC_ALL, "");
if (argc < 2) {
printf("Kullanım: %s <dizgi>\n", argv[0]);
return 1;
}
printf("Dizgi: \"%s\".\n", argv[1]);
/* To obtain each character of the string, it is easy to convert */
/* the string into wide string and re-convert each of the wide */
/* string into multibyte characters. */
/*
* mbstowcs tamponu için ayrılacak alanı hesaplamalıyız. Türkçe
* karakterler kullanılmışsa dizginin uzunluğu her halükarda geniş
* karakter sayısından büyük olacaktır. Bir miktar artık alan kullanmak
* pahasına strlen'in döndüğü bayt sayısını esas alıyoruz. Aksi halde
* önce dizgideki _gerçek_ karakter sayısını bulmamız gerekiyor ki bunun
* için de geniş karaktere dönüştürme yapmamız gerekir.
*/
n = strlen(argv[1]) * sizeof(wchar_t);
/*
* Tamponu ayır
*/
wp = (wchar_t *)malloc(n);
/*
* Geniş karaktere çevir, burada len karakter sayısını verir.
*/
len = mbstowcs(wp, argv[1], n);
for (i = 0; i < len; i++) {
/* re-convert from wide character to multibyte character */
int c;
/*
* Geniş karakteri tekrar dar karaktere çevir. Sonuç p
* dizgisinde (Türkçe karakterler için bu tek baytlık bir
* karakter olamaz artık değil mi?).
*/
c = wctomb(p, wp[i]);
/*
* Çevirme başarılıysa dizgiyi sonlandır.
*/
if (c > 0) p[c] = '\0';
/*
* Sonucu raporla
*/
printf("#%d konumundaki karakter \"%s\" (%d bayt) \n", i, p, c); }
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment