Простая программа на C — требуется справка

#c #syntax #while-loop

#c #синтаксис #цикл while

Вопрос:

У меня есть фрагмент C :

 #include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char s[2048];
    while (fgets(s, sizeof(s), stdin))
    {
        char *pos = strpbrk(s, ">rn");
        if (pos != 0)
        {
            char *end = strrchr( pos, '<' );
            if ( end )
                *end = '';
            fputs(pos 1, stdout);
        }

        return 0;
    } 
}
  

Хотя при обрезке текстового файла с его помощью он работает только с 1 строкой, например, он обрезает только 1 строку.

Если я попытаюсь обрезать несколько строк, например, файл с 30 строками, в нем останется только одна строка. Я в замешательстве, буду признателен за любую помощь.

Пример текстового файла:

 report2011510222820.html:   <td width="60%" bgcolor="#ffffff" class="tablebody" valign="top">C:UsersAdminmon.bat</td>
report2011510222820.html:   <td width="60%" bgcolor="#ffffff" class="tablebody" valign="top">C:test123.bat</td>
  

Вывод:

 C:UsersAdminmon.bat
  

Ожидаемый результат:

 C:UsersAdminmon.bat
C:test123.bat
  

Комментарии:

1. извините, но это НЕ C , измените свой тег на C или действительно сделайте это правильно на C

2. Нет, у вас есть фрагмент C. 🙂 Обычно вы можете получить гораздо лучшие ответы, если действительно сообщите людям, какой язык вы используете. Пока вы пишете код на C, помечайте вопрос тегом [c] и спрашивайте о C. Если вы представите, что это C , то в основном получите множество ответов, рассказывающих вам, как ваш код должен быть переписан на C

3. @Nim: Нет ничего плохого в использовании элементов ввода-вывода на C вместо потоков.

4. @Mario, я не говорил, что есть, я просто сказал, что это не C , это чистый C — и, следовательно, лучше помечать как C — или делайте это правильно на C , нет смысла притворяться, что одно есть другое…

5. @Mario #включить <stdio.h> недопустимо на C , однако это должно быть <cstdio> . Итак, это действительно C.

Ответ №1:

Ваш return 0; находится внутри while() цикла, поэтому он всегда завершается после первого выполнения цикла. Вы должны переместить ее наружу.

Чтобы добавить разрыв строки, замените

 if ( end )
    *end = '';
  

с

 if ( end )
{
    *end = 'n';
    *(end   1) = '';
}
  

Комментарии:

1. Привет, спасибо, но теперь все зачеркнутые строки отображаются в 1 строке, а не в их исходных строках, что можно сделать, чтобы сохранить их в их исходной строке?

2. @Mario Привет, спасибо, но теперь все зачеркнутые строки отображаются в 1 строке, а не в их исходных строках, что можно сделать, чтобы сохранить их в их исходной строке?

3. Вам нужно будет добавить разрыв строки в конец строк, которые вы обрезали (например, написав 'n' сразу после строк). Также обратите внимание, что (для MSVC не знаю вашего компилятора) среда выполнения выполнит преобразование n / rn «на лету», поэтому простого написания 'n' должно быть достаточно.

4. @James: добавьте printf(» n») после закрывающих фигурных скобок под fputs. Этого должно хватить.

5. @Mario Я использую mingw (с интерфейсом Bloodshed), не могли бы вы привести мне пример того, как добавить разрывы строк в мой код?

Ответ №2:

Попробуйте вывести return 0;` из цикла while

Ответ №3:

Ваш возврат находится внутри цикла «while», конец вашей программы должен выглядеть следующим образом:

   }
   return 0;
}
  

Ответ №4:

Эта строка вызывает у вас огорчение:

 return 0;
  

Если вы правильно разместили отступ в исходном коде, вам было бы намного проще увидеть ошибку. Здесь это исправлено и с отступом:

 #include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char s[2048];
    while (fgets(s, sizeof(s), stdin))
    {
        char *pos = strpbrk(s, ">rn");
        if (pos != 0)
        {
            char *end = strrchr( pos, '<' );
            if ( end )
                *end = '';
            fprintf(stdout, "%srn", pos   1); /* Fixed formatting */
         }
   }
    return 0;
}
  

Обратите внимание, что вы пометили это как код на C , но на самом деле это просто старый добрый C.