Re: آموزش برنامه نویسی با ++c
رشته های کاراکتری
یک مجموعه از کاراکترها را یک رشته کاراکتری(یا بطور خلاصه 'رشته' یا string) میگویند. مثلاً "This is a string" یک نمونه از رشته هاست. یک ثابت رشته ای همیشه در دوتا " قرارمیگیرد. اما ما دونوع رشته داریم: 1.مجموعه ای از char ها(که به رشته های سبک C-style) C) (منظور زبان C است) هم معروف اند) 2.از نوع کلاس string
رشته های سبک C
رشته های اصلی ++C هستند. برای این به فرمت C مشهورند که قبل از ++C در C وجود داشتند. این رشته ها در اصل آرایه ای از کاراکترها هستند. مثلاً رشته "char str[7] = "String ، که از 6 کاراکتر بعلاوه کاراکتر پایان رشته(که خود کامپایلر اضافه میکند) تشکیل شده و در هنگام تعریف مقدار اولیه گرفته است.
کاراکتر پایان رشته که به آن کاراکتر پوچ پایان دهنده (terminating null character) هم میگویند، در اصل یک کاراکتر است که وقتی چاپ شود یک فاصله چاپ خواهد شد(البته کاراکتر فاصله چیز دیگری است و کد اسکی آن 32 است)، و نام اصلی آن کاراکتر پوچ (null) است که در اینجا برای مشخص کردن پایان یک رشته از آن استفاده میشود. کد اسکی آن 0 است و بصورت کاراکتری '0\' نوشته میشود، بنابراین از کاراکتر '0' که کداسکی 48 دارد و یک 0 چاپ میشود متمایز میگردد. پس هر جایی که این کاراکتر در یک رشته قرار گیرد پایان آنرا مشخص میکند(حتی اگر بعد از آن کاراکترهای دیگری قرار داشته باشند) و در اعمال مختلفی که روی رشته انجام میشود معیار پایان آن قرار میگیرد. مثلاً وقتی یک رشته را با دستور cout << str چاپ کنید، فقط تا قبل از کاراکتر پوچی که در رشته قرار دارد چاپ میشود.
هر ثابت رشته ای که در بین دوتا " قرار میگیرد شامل یک '0\' هم در پایان خود هست، هرچند که شما چنین چیزی را مشخص نمیکنید، بنابراین وقتی با دستور "char str[7] = "String یک رشته را تعریف میکنید، کاراکتر هفتم آن '0\' قرار میگیرد (و مثلاً کاراکتر ششم g هست).
روش دیگر برای مقدار دهی یک آرایه کاراکتری(که در اصل نمایشگر یک رشته است) استفاده از مقداردهی هر کاراکتر بطور جداگانه است، مثلاً {'0\','char str[7] = {'S','t','r','i','n','g که همان String را نمایش میدهد، اما چون خودمان هر کاراکتر را مشخص کرده ایم، باید '0\' را هم مشخص کنیم.
برای مقدار دهی اولیه تهی('0\') به تمام اعضای یک آرایه کاراکتری میتوانید از عبارت {'char str[7] = {'\0 استفاده کنید، یا اینکه بجای '0\' بگذارید 0 چراکه همانطور که میدانید میتوان بجای نوشتن یک کاراکتر بین دوتا ' کد اسکی آنرا نوشت.
برای دریافت یک رشته از کاربر، اگر مثلاً [char str[7 را تعریف کرده باشیم، دستور cin >> str یک رشته را از کاربر دریافت میکند. البته باید تعداد کاراکترهای رشته ای که کاربر وارد میکند از طول آرایه کاراکتری ما کمتر باشد، یعنی برای str فقط 6 کاراکتر را از کاربر میتوان دریافت کرد(چرا که کاراکتر آخر را برای '0\' نگه میداریم و دستور cin بعد از دریافت رشته از سوی کاربر هفتمین کاراکتر را '0\' خواهد گذاشت). البته کاربر میتواند کمتر از 6 کاراکتر هم وارد کند، مثلاً اگر 3 تا وارد کند، کاراکتر چهارم مقدار '0\' خواهد گرفت و کاراکترهای پنجم تا هفتم تغییری نخواهند کرد.
اما اگر میخواهید با این مشکل مواجه نشوید که کاربر تعداد بیشتری کاراکتر وارد کند و برنامه شما هنگ کند، از دستور ;('cin.getline(str,4,'y استفاده کنید، که با استفاده از تابع getline یک ورودی به طول 4(با حساب کردن '0\') را از کاربر میگیرد و در str قرار میدهد، اگر زودتر از آن به کاراکتر y برسد، تا قبل از آن را در str قرار میدهد (در اصل y در اینجا حائل(delimiter) است). هریک از str و 4 و y یک آرگومان تابع getline هستند که شما میتوانید بجای آنها هرچیز دیگری از همان نوع بگذارید. اما مقداری که برای آرگومان دوم(4) در نظر میگیرید، باید با حساب کردن '0\' حداکثر برابر طول آرایه ای که در آرگومان اول مشخص میکنید باشد. یعنی اگر طول آرایه شما 7 هست، حداکثر 7 را میتوانید برای آرگومان دوم در نظر بگیرید و getline شش کاراکتر را از ورودی گرفته و در str قرار میدهد و کاراکتر هفتم را '0\' میگذارد.چنانچه کاربر کاراکتر های بیشتری وارد کند، اگر بعداً دستورات ورودی بیشتری در برنامه داشته باشیم، این کاراکترها را دریافت خواهند کرد، یعنی هیچ وقت ورودی های کاربر از بین نمیروند و در بافر ورودی قرارمیگیرند تا اینکه با یک دستور ورودی خوانده شوند یا با دستوری دیگر یا رسیدن به انتهای برنامه حذف شوند.
getline یک نمونه دو پارامتری هم دارد، مثلاً مثال قبل را میتوانید اینگونه بنویسید: (cin.getline(str,4 با این دستور کاراکترها تا جایی از کاربر دریافت میشوند که کلید Enter زده شده باشد یا اینکه به حد 3 کاراکتر رسیده باشند(این نمونه از دستور مشابه ('cin.getline(str,4,'\n هست، چراکه فشاردادن کلید Enter مقدار 'n\' را تولید میکند). این شکل از دستور برای زمانی مناسب است که یک حداکثری برای اندازه ورودی کاربر در نظر گرفته ایم اما حداقلی در نظر نداریم.
یکی از مزیت های getline به cin در دریافت رشته ها: getline رشته ای که بین آن فاصله وجود دارد را هم یکجا میگیرد، اما cin همیشه تاجایی که کاربر یک کاراکتر فاصله وارد کرده است میخواند. بنابراین getline میتواند کل 34 12 را با یک دستور بخواند، اما cin در هر بار فقط یک قسمت را میخواند، اول 12 وبعد 34 را دریافت میکند.
توجه: 'توابع مفید برای کار برروی رشته ها' و 'رشته های نوع string' بعد از توضیح توابع در قسمت های بعدی آورده خواهند شد.