تجاهل المساحات الإضافية عند استخدام FGTS
سؤال
أنا أستخدم fgets مع stdin للقراءة في بعض البيانات ، مع طول الحد الأقصى الذي قرأته في 25. مع أحد الاختبارات التي أقوم بتشغيلها على هذا الرمز ، هناك بضع مئات من المساحات بعد البيانات التي أريدها - يؤدي إلى فشل البرنامج.
هل يمكن لأي شخص أن ينصحني بكيفية تجاهل كل هذه المساحات الإضافية عند استخدام FGTS والذهاب إلى السطر التالي؟
المحلول
يستخدم fgets()
بشكل متكرر ، ثم مسح السلسلة لمعرفة ما إذا كانت جميع المساحات (وما إذا كانت تنتهي بخط جديد) وتجاهلها إذا كان كذلك. او استعمل getc()
أو getchar()
في حلقة بدلا من ذلك؟
char buffer[26];
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
...process the first 25 characters...
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}
يتجاهل هذا الرمز ببساطة جميع الأحرف حتى الخط الجديد التالي. إذا كنت ترغب في التأكد من أنها مساحات ، فأضف اختبارًا في الحلقة (الداخلية) - ولكن عليك أن تقرر ما يجب القيام به إذا لم تكن الشخصية مساحة.
نصائح أخرى
تهجئة الاقتراح الذي قدمه جوناثان ليفلر حول GETC ():
أفترض أن لديك حلقة مثل هذا:
while (!feof(stdin)) {
fgets(buf, 25, stdin);
...
}
تغييره مثل هذا:
while (!feof(stdin)) {
int read = fgets(buf, 27, stdin);
if (read > 26) { // the line was *at least* as long as the buffer
while ('\n' != getc()); // discard everything until the newline character
}
...
}
تحرير: آه ، جوناثان أسرع مما أنا في كتابة C. :)
جرب هذا الرمز ، لإزالة المساحات الخلفية.
char str[100] ;
int i ;
fgets ( str , 80 , stdin ) ;
for ( i=strlen(str) ; i>0 ; i-- )
{
if ( str[i] != ' ' )
{
str[i+1]='\0';
break ;
}
}