مفهوم کاراکتر
در زبان C، یک کاراکتر یک واحد داده است که یک نویسهٔ منفرد (مانند حرف، رقم، علامت یا کاراکتر کنترلی) را نمایش میدهد. نوع دادهٔ char در C برای ذخیرهسازی و مدیریت کاراکترها بهکار میرود .
نکتهٔ مهم و اساسی در مورد char در C این است که هر کاراکتر در حقیقت یک عدد صحیح کوچک است. کامپیوترها خودشان کاراکترها را مستقیماً نمیشناسند؛ بلکه آنها را بهعنوان کدهای عددی در یک جدول کدگذاری (مانند ASCII) ذخیره میکنند . این ویژگی به C امکان انجام محاسبات ریاضی روی کاراکترها را نیز میدهد.
نوع دادهٔ char و اندازهٔ آن
نوع char دقیقاً ۱ بایت (۸ بیت) فضا در حافظه اشغال میکند که میتواند یک کاراکتر را با استفاده از جدول کدگذاری استاندارد (معمولاً ASCII) ذخیره کند:
#include <stdio.h> int main() { char letter = 'A'; printf("Size of char: %zu byte\n", sizeof(char)); // خروجی: 1 printf("Character: %c\n", letter); // خروجی: A printf("ASCII value: %d\n", letter); // خروجی: 65 return 0; }
نکته:
charدر C همچون سایر انواع پایه، میتواند با اصلاحکنندههایsignedیاunsignedتعریف شود. محدودهٔsigned charاز ۱۲۸- تا ۱۲۷ وunsigned charاز ۰ تا ۲۵۵ است. نوعcharبهتنهایی و بدون اصلاحکننده، رفتارش به کامپایلر بستگی دارد (میتواند signed یا unsigned باشد) .
کاراکترها و جدول ASCII
جدول ASCII (American Standard Code for Information Interchange) یک استاندارد رایج برای نمایش کاراکترها با اعداد است. در این جدول، هر کاراکتر یک کد عددی منحصربهفرد دارد که بین ۰ تا ۱۲۷ است. C از این جدول برای نگاشت بین کاراکترها و اعداد استفاده میکند :
بخشهای مهم جدول ASCII
| محدوده | توضیح | مثال |
|---|---|---|
| ۰-۳۱ | کاراکترهای کنترلی (غیرقابل چاپ) | \n (۱۰)، \t (۹) |
| ۳۲ | فاصله (Space) | ' ' |
| ۴۸-۵۷ | ارقام (۰ تا ۹) | '0' (۴۸) تا '9' (۵۷) |
| ۶۵-۹۰ | حروف بزرگ (A تا Z) | 'A' (۶۵) تا 'Z' (۹۰) |
| ۹۷-۱۲۲ | حروف کوچک (a تا z) | 'a' (۹۷) تا 'z' (۱۲۲) |
#include <stdio.h> int main() { // نمایش مقادیر ASCII printf("'A' = %d\n", 'A'); // خروجی: 65 printf("'a' = %d\n", 'a'); // خروجی: 97 printf("'0' = %d\n", '0'); // خروجی: 48 printf("' ' = %d\n", ' '); // خروجی: 32 printf("'$' = %d\n", '$'); // خروجی: 36 // تبدیل عدد به کاراکتر printf("65 = '%c'\n", 65); // خروجی: 'A' printf("97 = '%c'\n", 97); // خروجی: 'a' return 0; }
تعریف و مقداردهی کاراکترها
با استفاده از کاراکتر (در گیومهٔ تکی)
char grade = 'A'; char sign = '+'; char digit = '5'; char space = ' ';
با استفاده از مقدار عددی (کد ASCII)
char letter = 65; // معادل 'A' char newline = 10; // معادل '\n' char zero = 48; // معادل '0'
با استفاده از کاراکترهای فرار (Escape Sequences)
char newline = '\n'; // خط جدید char tab = '\t'; // تب char backslash = '\\'; // بکاسلش char quote = '\"'; // گیومهٔ دوتایی char single = '\''; // گیومهٔ تکی char null_char = '\0'; // کاراکتر Null (پایان رشته)
نکته: کاراکترها در C با گیومهٔ تکی (
' ') نوشته میشوند. رشتهها با گیومهٔ دوتایی (" ") تعریف میشوند و نباید با کاراکترها اشتباه گرفته شوند .
عملیات ریاضی روی کاراکترها
از آنجا که کاراکترها در حقیقت اعداد صحیح هستند، میتوان روی آنها عملیات ریاضی و منطقی انجام داد :
تبدیل حروف بزرگ به کوچک و بالعکس
در جدول ASCII، اختلاف بین حروف بزرگ و کوچک برابر با ۳۲ است:
#include <stdio.h> int main() { char uppercase = 'A'; char lowercase = uppercase + 32; // 'A' + 32 = 'a' printf("%c -> %c\n", uppercase, lowercase); // خروجی: A -> a char lower = 'z'; char upper = lower - 32; // 'z' - 32 = 'Z' printf("%c -> %c\n", lower, upper); // خروجی: z -> Z return 0; }
افزایش و کاهش کاراکترها
char ch = 'A'; ch++; // 'B' ch++; // 'C' ch += 3; // 'F' printf("%c\n", ch); // خروجی: F
محاسبهٔ فاصلهٔ بین کاراکترها
char start = 'A'; char end = 'Z'; int distance = end - start; // 25 printf("Distance: %d\n", distance); // خروجی: 25
کاراکترهای کنترلی (Control Characters)
کاراکترهای کنترلی کاراکترهایی با کدهای ASCII ۰ تا ۳۱ هستند که قابل چاپ نیستند و برای کنترل جریان داده یا نمایش استفاده میشوند:
#include <stdio.h> int main() { // کاراکترهای کنترلی مهم char newline = '\n'; // خط جدید (ASCII 10) char tab = '\t'; // تب (ASCII 9) char bell = '\a'; // زنگ/هشدار (ASCII 7) char backspace = '\b'; // بکاسپیس (ASCII 8) char null_char = '\0'; // کاراکتر Null (ASCII 0) - پایان رشتهها printf("Hello%cWorld\n", newline); // خروجی: // Hello // World printf("Name:%cAli\n", tab); // خروجی: Name: Ali printf("Alert%c!\n", bell); // ممکن است صدای زنگ تولید کند return 0; }
تفاوت بین کاراکتر و رشته
یکی از مفاهیم مهم و مستعد خطا در C، تفاوت بین یک کاراکتر و یک رشته است:
-
کاراکتر: با گیومهٔ تکی
' 'نوشته میشود و یک کاراکتر واحد را نشان میدهد -
رشته: با گیومهٔ دوتایی
" "نوشته میشود و یک آرایه از کاراکترهاست که با\0خاتمه مییابد
char ch = 'A'; // ✅ یک کاراکتر char str[] = "A"; // ✅ یک رشته با دو کاراکتر ('A' و '\0') // char ch = "A"; // ❌ خطا: نمیتوان رشته را به char نسبت داد // char str = 'A'; // ❌ اگرچه کامپایل میشود، اما مفهوم رشته را ندارد
توابع مفید برای کاراکترها در کتابخانهٔ ctype.h
کتابخانهٔ ctype.h توابع مفیدی برای بررسی و تبدیل کاراکترها فراهم میکند:
| تابع | توضیح | مثال |
|---|---|---|
isalpha(c) | بررسی حرف بودن | isalpha('A') → ۱ (true) |
isdigit(c) | بررسی رقم بودن | isdigit('5') → ۱ (true) |
isalnum(c) | بررسی حرف یا رقم بودن | isalnum('A') → ۱ |
isspace(c) | بررسی فاصله یا تب بودن | isspace(' ') → ۱ |
islower(c) | بررسی کوچک بودن | islower('a') → ۱ |
isupper(c) | بررسی بزرگ بودن | isupper('A') → ۱ |
tolower(c) | تبدیل به کوچک | tolower('A') → 'a' |
toupper(c) | تبدیل به بزرگ | toupper('a') → 'A' |
#include <stdio.h> #include <ctype.h> int main() { char ch = 'a'; if (islower(ch)) { printf("'%c' is lowercase\n", ch); printf("Uppercase: '%c'\n", toupper(ch)); } char digit = '9'; if (isdigit(digit)) { printf("'%c' is a digit\n", digit); } char symbol = '$'; if (!isalnum(symbol)) { printf("'%c' is not alphanumeric\n", symbol); } return 0; }
خروجی:
'a' is lowercase Uppercase: 'A' '9' is a digit '$' is not alphanumeric
کاراکترهای خاص و غیرقابل چاپ
علاوه بر کاراکترهای کنترلی، کاراکترهایی وجود دارند که بهصورت معمول قابل چاپ نیستند یا معنای خاصی در خروجی دارند:
#include <stdio.h> int main() { // کاراکترهای خاص char backslash = '\\'; // چاپ بکاسلش char double_quote = '\"'; // چاپ گیومهٔ دوتایی char single_quote = '\''; // چاپ گیومهٔ تکی char question = '\?'; // چاپ علامت سوال (برای جلوگیری از تریگراف) char bell = '\a'; // زنگ (ممکن است صدا ایجاد کند) printf("Backslash: %c\n", backslash); printf("Double quote: %c\n", double_quote); printf("Single quote: %c\n", single_quote); printf("Question: %c\n", question); // کاراکتر Null - پایان رشتهها char str[] = "Hello\0World"; printf("%s\n", str); // فقط "Hello" چاپ میشود (تا قبل از \0) return 0; }
مثالهای عملی
مثال ۱: شمارش حروف، ارقام و سایر کاراکترها
#include <stdio.h> #include <ctype.h> int main() { char text[] = "Hello World 123! @#"; int letters = 0, digits = 0, others = 0; for (int i = 0; text[i] != '\0'; i++) { if (isalpha(text[i])) { letters++; } else if (isdigit(text[i])) { digits++; } else { others++; } } printf("Text: \"%s\"\n", text); printf("Letters: %d\n", letters); printf("Digits: %d\n", digits); printf("Other characters: %d\n", others); return 0; }
خروجی:
Text: "Hello World 123! @#" Letters: 10 Digits: 3 Other characters: 6
مثال ۲: تبدیل حروف اول کلمات به بزرگ
#include <stdio.h> #include <ctype.h> int main() { char text[] = "hello world from c programming"; int new_word = 1; for (int i = 0; text[i] != '\0'; i++) { if (new_word && isalpha(text[i])) { text[i] = toupper(text[i]); new_word = 0; } if (text[i] == ' ') { new_word = 1; } } printf("Capitalized: %s\n", text); // خروجی: Hello World From C Programming return 0; }
مثال ۳: معکوس کردن یک رشته با کاراکترها
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello"; int len = strlen(str); printf("Original: %s\n", str); // معکوس کردن for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } printf("Reversed: %s\n", str); // خروجی: olleH return 0; }
خطاهای رایج
۱. استفاده از گیومهٔ دوتایی برای کاراکتر
char ch = "A"; // ❌ خطا: "A" یک رشته است (دو کاراکتر 'A' و '\0') char ch = 'A'; // ✅ صحیح
۲. استفاده از گیومهٔ تکی برای رشته
char str[] = 'Hello'; // ❌ خطا: 'Hello' معتبر نیست (چند کاراکتر) char str[] = "Hello"; // ✅ صحیح
۳. فراموش کردن کاراکتر Null (\0)
char str[5] = "Hello"; // ❌ خطا: فضای کافی برای 'Hello\0' (۶ کاراکتر) نیست char str[6] = "Hello"; // ✅ صحیح
۴. استفاده از مقدار عددی خارج از محدودهٔ char
char ch = 200; // ⚠️ اگر char signed باشد، سرریز میشود unsigned char ch = 200; // ✅ صحیح
۵. مقایسهٔ مستقیم کاراکترها بدون در نظر گرفتن حساسیت
if (ch == 'A') { // فقط 'A' بزرگ را تشخیص میدهد // ... } // بهتر است از toupper(ch) یا tolower(ch) استفاده شود
خلاصه و نکات کلیدی
-
نوع
charدر C یک بایت (۸ بیت) حافظه اشغال میکند -
کاراکترها در واقع اعداد صحیح هستند که کد ASCII آنها را ذخیره میکنند
-
کاراکترها با گیومهٔ تکی (
'A') نوشته میشوند، نه گیومهٔ دوتایی -
میتوان روی کاراکترها عملیات ریاضی انجام داد (چون عدد هستند)
-
جدول ASCII نگاشت بین کاراکترها و اعداد (۰ تا ۱۲۷) را تعریف میکند
-
کتابخانهٔ
ctype.hتوابع مفیدی برای بررسی و تبدیل کاراکترها دارد -
کاراکترهای کنترلی مانند
\n,\t,\0برای کنترل خروجی و پایان رشته استفاده میشوند -
رشتهها در C با کاراکتر Null (
\0) خاتمه مییابند -
signed charمحدودهٔ ۱۲۸- تا ۱۲۷ وunsigned charمحدودهٔ ۰ تا ۲۵۵ دارد -
از توابع
isalpha,isdigit,toupper,tolowerو مشابه برای پردازش کاراکترها استفاده کنید
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات