در زبان سی دریافت رشته با مشکلات پنهان بسیار زیادی همراه است.
برنامه نویسان معمولا از تابع gets برای دریافت رشته استفاده می کنند دریغ از این که این تابع یک مشکل بزرگ دارد.
در صورتی که از این تابع به همراه دستور scanf استفاده کنیم این مشکل ظاهر می شود.
دستور scanf وقتی که ورودی را در متغیر ذخیره می کند، بافر (حافظه موقت میانی) را پاک نمی کند. از آن جایی که تابع gets هم با بافر کار می کند در این گونه مواقع مقدار قبلی بافر را برمی گرداند.
پس باید حتما قبل از استفاده کردن از تابع gets بافر را پاک کنیم. روش های متفاوتی برای این کار وجود دارد اما این روش ها توسط بسیاری از کامپایلرها پشتیبانی نمی شوند. (با کمی جستجو در اینترنت متوجه این موضوع می شوید.)
اما در این جا من به جای تابع gets یک تابع مشابه و بسیار ساده به نام getLine نوشتم که دیگر از بافر استفاده نمی کند و می تواند یک خط کامل را (به همراه فاصله) از ورودی دریافت کند و در آرایه ی کاراکتری ذخیره کند.
// Get a string from input(including space) // C Programming // By: Sina Moradi // Website: Samiantec.ir #include#include void getLine(char *); int main() { char s[40]; printf("Enter a string: (including space)\n"); getLine(s); printf("Your String: %s",s); getch(); return 0; } void getLine(char * s) { int i; char c; for (i = 0;;i++) { c = getchar(); if (c == '\n') break; s[i]=c; } s[i]='\0'; }