تجاهل المساحات الإضافية عند استخدام FGTS

StackOverflow https://stackoverflow.com/questions/2481879

  •  21-09-2019
  •  | 
  •  

سؤال

أنا أستخدم 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 ;
            }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top