#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 , то в основном получите множество ответов, рассказывающих вам, как ваш код должен быть переписан на C3. @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.