PDA

View Full Version : سوال: ()cin.getline در برابر " , "



...StacK...
پنج شنبه 17 بهمن 1387, 00:53 صبح
سلام دوستان به کد زیر نگاه کنید:



// xman.cpp : Defines the entry point for the console application.
#include"stdafx.h"
#include<iostream>
#include<ctype.h>
usingnamespace std;
//program writed in vc++ 2005
int main()
{
char clause[50];
do
{
cin.getline(clause,50,',');
if(*clause)cout<<"\t["<<clause<<"]\n";
}while(*clause);
cout<<"\n"<<clause;


return 0;
}



حالا به خروجی زیر نگاه کنید:


C:\xman\debug>xman
,

C:\xman\debug>



در اینجا من ورودی را "," دادم و برنامه خاتمه یافت.

دلیلش هم این هست که ارایه NUL هست و شرط حلقه شکسته میشه.

حالا به این خروجی نوجه کنید:


C:\xman\debug>xman
barnamenevis.org,stack,
[barnamenevis.org]
[stack]
,
[
]
,
[
]
,
[
]
,
[
]
,
[
]
^Z
[
]

من در این سری بعد از ورودی که در خط اول دادم 5 بار دیگه به برنامه ورودی "," رو دادم

و هر بار برنامه یک خط خالی رو برای من چاپ کرد و مهمتر اینکه شرط حلقه هم شکسته

نشد. !!! علت این امر چیه؟؟؟؟؟؟؟؟؟؟؟؟

emad_67
پنج شنبه 17 بهمن 1387, 11:41 صبح
شما وقتی به طور مثال مینویسی:


c,visual,

کاری که انجام میشه به این شکل هست که تابع getline تا کاراکتر , رو از ورودی میخونه و در آرایه قرار میده یعنی در بار اول کاراکتر c در آرایه هست و چاپ میشه، دفعه بعد که به ابتدای حلقه بر میگردیم همچنان رشته visual, در جریان ورودی قرار دارن پس بار دیگه تا کاراکتر , خونده میشه و چاپ میشه یعنی کلمه visual.
اما چیزی که این وسط هست و شما اونو نمیبینی کاراکتر enter هست که در انتهای رشته شما قرار داره و علت مشکل شما هم همینه. در ادامه مثال قبل فرض کن که کلمه visual هم خونده شد و مجددا به ابتدای حلقه بر گشتیم و شما میای و کاراکتر , رو میزنی، توجه داشته باش که در انتهای رشته visual, یک enter وجود داشت که بعد از چاپ visual همچنان کاراکتر enter در بافر قرار داره و وقتی شما , رو زدی در واقع رشته ما ,enter هست. بنابراین یک بار دیگه تابع getline رشته ورودی رو تا کاراکتر , میخونه که همون enter هست و ه خاطر همینه که یک خط خالی چاپ میشه. برای تفهیم بیشتر اینو تست کن:


char clause[50];
do
{
cin.getline(clause,50,',');
if(*clause)
cout<<"\t["<<(int)*clause<<"]\n";
}
while(*clause);
cout<<"\n"<<(int)*clause;

اما در حالت اول که میای فقط , رو میزنی، در واقع قبل از , هیچ چیزی در جریان ورودی وجود نداشته و null در آرایه قرار میگیره و ....