Как очистить строку в си
Перейти к содержимому

Как очистить строку в си

Стереть текущую напечатанную строку консоли

Я хочу напечатать пока на той же строке вместо Привет.

9 ответов

Вы можете использовать коды выхода VT100 . Большинство терминалов, включая xterm, поддерживают VT100. Для удаления строки это ^[[2K . В Си это дает:

Вы можете использовать \r ( возврат каретки ), чтобы вернуть курсор в начало строки:

Это напечатает пока в той же строке. Однако он не удалит существующие символы, и, поскольку пока короче, чем привет , вы получите byelo . Чтобы стереть его, вы можете сделать новый отпечаток длиннее, чтобы перезаписать дополнительные символы:

Или сначала удалите его с несколькими пробелами, а затем напечатайте новую строку:

Это выведет привет , затем перейдет к началу строки и перезапишет ее пробелами, затем снова вернется к началу и напечатает пока .

Некоторые полезные тонкости .

\33[2K стирает всю строку, на которой находится курсор в данный момент

\033[A перемещает курсор вверх на одну строку, но в том же столбце , т.е. не в начало линия

\r перемещает курсор в начало строки (r для перемотки назад), но нет стереть что-нибудь

В частности, в xterm я попробовал ответы, упомянутые выше, и единственный найденный способ стереть строку и начать заново в начале — это последовательность (из приведенного выше комментария @ Stephan202, а также @vlp и @mantal) \33[2K\r

На заметку о реализации, чтобы заставить его работать должным образом, например, в сценарии обратного отсчета, поскольку я не использовал символ новой строки ‘\n’ в конце каждого fprintf() , поэтому мне пришлось fflush() поток каждый раз (чтобы дать вам некоторый контекст, я запустил xterm, используя форк на машине linux без перенаправления stdout, я просто записывал в буферизованный указатель FILE fdfile с неблокирующим файловым дескриптором, который я сидел по адресу псевдотерминала, который в моем случае был /dev/pts/21 ):

Обратите внимание, что я использовал последовательность \ 33 [2K, чтобы стереть строку, за которой следовала последовательность перемотки \r , чтобы переместить курсор на начало строки. Мне пришлось fflush() после каждого fprintf() , потому что У меня нет символа новой строки в конце ‘\n’ . Тот же результат без использования fflush () потребует дополнительной последовательности для перехода вверх по строке:

Обратите внимание, что если у вас есть что-то в строке непосредственно над строкой, в которую вы хотите записать, это будет перезаписано с первой функцией fprintf (). Вам придется оставить дополнительную строку выше, чтобы сделать первое движение вверх на одну строку:

Обычно, когда в конце строки стоит символ ‘\ r’, печатается только возврат каретки без перевода строки. Если у вас есть следующее:

Одна вещь, которую я могу предложить (возможно, в качестве обходного пути), — это иметь строку фиксированного размера с нулевым символом в конце, которая инициализируется всеми пробелами, заканчиваясь символом ‘\ r’ (каждый раз перед печатью), а затем использовать strcpy для копирования Ваша строка в него (без перевода строки), поэтому каждый последующий вывод будет перезаписывать предыдущую строку. Примерно так:

Вы можете выполнить проверку ошибок, чтобы my_string всегда был как минимум на одну длину меньше, чем str , но вы поймете основную идею.

Правильный способ очистить C-строку

Я работал над проектом на C, который требует от меня много возиться со строками. Обычно я программирую на C ++, так что это немного отличается от простого слова string.empty ().

Мне интересно, как правильно очистить строку в C. Может ли это быть?

6 ответов

Это зависит от того, что вы подразумеваете под «пустым». Если вам просто нужна строка нулевой длины, тогда ваш пример будет работать.

Это также будет работать:

Если вы хотите обнулить все содержимое строки, вы можете сделать это следующим образом:

Но это будет работать только для обнуления до первого символа NULL.

Если строка является статическим массивом, вы можете использовать:

Необходимо имя строки, и ее длина будет равна нулю, все символы, другие методы могут остановиться на первом ноле, с которым они сталкиваются

Я новичок, но . Насколько мне известно, лучший способ — это

Если вы пытаетесь очистить буфер приема для чего-то, что принимает строки, я обнаружил, что лучший способ — использовать memset, как описано выше. Причина в том, что независимо от того, насколько велика следующая полученная строка (конечно, ограниченная размером буфера), она автоматически будет строкой asciiz, если записана в буфер, который был предварительно обнулен.

Зависит от того, что вы подразумеваете под опорожнением. Если вам просто нужна пустая строка, вы можете сделать

Если вы хотите установить для каждого элемента ноль, сделайте

Два других способа: strcpy(str, «»); и string[0] = 0

Чтобы действительно удалить содержимое переменной (если у вас грязный код, который не работает должным образом с приведенными выше фрагментами: P), используйте цикл, как в примере ниже.

Если вы хотите очистить динамически выделенный массив символов с самого начала, вы можете использовать комбинацию malloc () и memset () или — и это намного быстрее — calloc (), которая делает то же самое, что и malloc, но инициализирует весь массив с Null.

Наконец, я хочу, чтобы вы помнили о времени выполнения. Более того, если вы обрабатываете огромные массивы (от 6 цифр и выше), вы должны попытаться установить первое значение равным Null вместо того, чтобы запускать memset () через всю строку.

Сначала это может показаться грязнее, но работает намного быстрее. Вам просто нужно уделять больше внимания своему коду;)

Как очистить указатель на char в Си?

У меня есть функция, funcrion(FILE *in, char *result) пишушая некую последовательность символов в строку result. Однако, чтобы каждый раз записывать новую последовательность, необходимо внутри функции очистить строку result перед тем, как писать в неё что-либо, дабы не появлялись лишние символы (например, при первом вызове было записано "123456", а при втором нужно записать "abc". Если не очищать, получается второй раз "abc456").

Как это сделать, подскажите, пожалуйста!

Re: Как очистить указатель на char в Си?

ужас .. почитай C туториал перед тем как что-то писать ..

записывай ‘\0’ последним символом, с точки зрения C строка это набор символов с ‘\0’ на конце

Re: Как очистить указатель на char в Си?

Дело в том, что я пишу строку посимвольно, и когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.

Re: Как очистить указатель на char в Си?

anonymous (*) (16.01.2005 21:44:23):

> когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.

Попробуй еще раз прочитать то, что тебе ответил lg. Он прямо ответил на то, что надо делать, ". когда в первый раз символов больше, чем во второй. ".

Re: Как очистить указатель на char в Си?

Re: Как очистить указатель на char в Си?

Народ, ну извините, я же прямо сказал, что я ламер 🙂 Не заработало. Видимо, проблема где-то ещё. Всем спасибо, буду разбираться, читать мануалы, и быть вежливым при встрече с линуксоидами =)

Re: Как очистить указатель на char в Си?

Не надо извиняться. Лучше просто почитай что такой стока в С, и что такой указатели.

Re: Как очистить указатель на char в Си?

anonymous (*) (16.01.2005 22:00:22):

> Не заработало. Видимо, проблема где-то ещё.

"Этого не может быть, потому что не может быть никогда"

Ок, чтобы "очистить" строку result, напиши такой оператор:

В ТОЧНОСТИ, включая ‘*’.

И почитай хоть что-нибудь про Си. Твой вопрос из разряда "А куда лошадь запрягают?":-)

Re: Как очистить указатель на char в Си?

Вот и мне казалось, что не может, потому что именно так я и пытался с самого начала сделать, но не получилось 🙂

В общем, всё равно не получается 🙁 Может, у меня что-то другое в функции криво написано? Вот такая функция, должна брать символы, разделённые пустыми символами, или вертикальной чертой:

Re: Как очистить указатель на char в Си?

Тьфу ты. вот так более понятно:

int read_next_charzv_from_file (FILE *in, char *result)<

if (feof(in)) return 1;

while (isspace(c = fgetc (in)));

if (c != ‘|’) ungetc (c,in);

Re: Как очистить указатель на char в Си?

int read_next_charzv_from_file (FILE *in, char *result)<

if (feof(in)) return 1;

while (isspace(c = fgetc (in)));

if (c != ‘|’) ungetc (c,in);

Re: Как очистить указатель на char в Си?

Ооо, отлично, спасибо! Я пробовал и то и то, но отдельно. Сейчас догнал, почему не работало! Спасибо всем, кто помогал, тему можно считать закрытой 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *