Как очистить указатель на char в Си?
У меня есть функция, funcrion(FILE *in, char *result) пишушая некую последовательность символов в строку result. Однако, чтобы каждый раз записывать новую последовательность, необходимо внутри функции очистить строку result перед тем, как писать в неё что-либо, дабы не появлялись лишние символы (например, при первом вызове было записано «123456», а при втором нужно записать «abc». Если не очищать, получается второй раз «abc456»).
Как это сделать, подскажите, пожалуйста!
anonymous
16.01.05 21:17:22 MSK

Re: Как очистить указатель на char в Си?
ужас .. почитай C туториал перед тем как что-то писать ..
записывай ‘\0’ последним символом, с точки зрения C строка это набор символов с ‘\0’ на конце
lg ★★
( 16.01.05 21:30:22 MSK )
Ответ на: Re: Как очистить указатель на char в Си? от lg 16.01.05 21:30:22 MSK
Re: Как очистить указатель на char в Си?
Дело в том, что я пишу строку посимвольно, и когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.
anonymous
( 16.01.05 21:44:23 MSK )
Ответ на: Re: Как очистить указатель на char в Си? от anonymous 16.01.05 21:44:23 MSK
Re: Как очистить указатель на char в Си?
anonymous (*) (16.01.2005 21:44:23):
> когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.
Попробуй еще раз прочитать то, что тебе ответил lg. Он прямо ответил на то, что надо делать, «. когда в первый раз символов больше, чем во второй. «.
Удаление символов из строки
K&R (61-62). Приводится пример функции squeeze , которая удаляет все символы c из строки s .
Ниже представлен полный код программы с использованием этой функции. А также ответ к упражнению 2.4, где предлагается написать функцию, удаляющую из строки s1 все символы, встречающиеся в строке s2 .
Алгоритм удаления символа из строки можно описать так:
- Пока не будет достигнут конец строки,
- если очередной символ строки не равен символу для удаления,
- записать очередной символ по месту индекса j , после этого последний увеличить на единицу.
Другими словами, алгоритм сводится к тому, что символ по индексу i затирается следующим символом, если он совпал с символом для удаления; т.к запись идет по счетчику j , а он увеличивается лишь тогда, когда символы из строки и для удаления не совпадают.
Алгоритм удаления тех символов строки, которые встречаются в другой строке, отличается от предыдущего тем, что нужно по очереди извлекать символы из второй строки и удалять их из первой. Т.е. приведенный выше алгоритм следует вложить в цикл перебора символов второй строки.
Удаление всех символов c из строки
#include #define MAX 100 void squeeze (char s[], int c); main () char str0[MAX]; int i, c; for (i = 0; (c = getchar()) != '\n'; i++) str0[i] = c; str0[i] = '\0'; c = getchar(); squeeze (str0, c); printf("%s\n", str0); > void squeeze (char s[], int c) int i, j; for (i = j = 0; s[i] != '\0'; i++) if (s[i] != c) s[j++] = s[i]; s[j] = '\0'; >
Удаление всех символов, встречающихся в строке s2 , из строки s1
#include #define MAX 100 #define DEL 10 void squeeze (char s[], char s1[]); void written (char s[]); main() char str[MAX]; char str1[DEL]; written (str); written (str1); squeeze (str, str1); printf("%s\n", str); > void written (char s[100]) int i, c; i = 0; while ((c = getchar()) != '\n') s[i] = c; ++i; > s[i] = '\0'; > void squeeze (char s[], char s2[]) int k, i, j; for (k = 0; s2[k] != '\0'; k++) for (i = j = 0; s[i] != '\0'; i++) if (s[i] != s2[k]) s[j++] = s[i]; s[j] = '\0'; > >
Примечание. Во второй программе запись символов в строку выделена в отдельную функцию, т.к. надо записать две строки. Иначе пришлось бы дублировать код.
X Скрыть Наверх
Решение задач на языке C
Как удалить выведенную строку в C++
При запуске открывается окно с тремя строчками.
Вместо нужно вставить часть кода, которая удаляла бы вторую строку.
Заранее спасибо!
Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Считать с консоль строку, ранее выведенную
Здравствуйте. Проблема заключается в следующем. С помощью cout вывожу на экран 8 цифр, например 1.
Как присвоить переменной строку выведенную в CMD
Пример ввожу в CMD wmic diskdrive get size он выдаст Size 200039632128 128034708480 как.
разобрать строку выведенную в хтмл использовав метку
Здравствуйте. помогите решить задачу: Я в цикле делаю выборку и создаю массив: foreach ($new.
Как обработать выведенную информацию
Доброго времени суток. Экспериментирую с node js. Задание заключается в том, чтобы просматривать.
1742 / 1036 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
Сообщение от Turbo_Pgmer_132 
Вместо <. >нужно вставить часть кода, которая удаляла бы вторую строку.
Мсьё понимает толк в извращениях.
Сделать можно, но геморно.
Не проще ли не выводить строку, чем потом её удалять из консоли?
Регистрация: 13.07.2017
Сообщений: 23
Наверное можно просто очистить экран с помошью
system("cls")
и выводить уже без второй строки
Нуу тоесть как то так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include #include using namespace std; int main() { cout "[N] - Новая игра\n"; cout "[P] - Пауза\n"; cout "[Esc] - Выход\n"; getch(); system("cls"); cout "[N] - Новая игра\n"; //cout cout "[Esc] - Выход\n"; getch(); }
Регистрация: 19.03.2019
Сообщений: 147
А если, допустим, я напишу значение какой-либо переменной, а потом поменяю его? Мне надо будет сначала стирать всё с экрана, потом выводить в консоль заново.
Короче, муторно!
И вообще, есть ли какая-то команда наподобие cout, только чтобы при изменении значения переменной сразу же изменялся и текст в консоли?
ОООООООООчень надо!
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
Сообщение от Turbo_Pgmer_132 
И вообще, есть ли какая-то команда наподобие cout, только чтобы при изменении значения переменной сразу же изменялся и текст в консоли?
Нету. Нужно всё стирать и перезаписывать сначала. Это как обновление экрана в играх. Конечно, можно взять часть раскраски пикселей с предыдущего кадра, но показать их на дисплее можно только в следующем кадре.
Регистрация: 19.03.2019
Сообщений: 147
Сообщение от L0M 
Сделать можно, но геморно.
И вообще, даже если геморно, лучше, чем ничего!
5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530
Turbo_Pgmer_132, для винды есть SetConsoleCursorPosition
Регистрация: 19.03.2019
Сообщений: 147
Сообщение от zayats80888 
для винды есть SetConsoleCursorPosition
А ну-ка поподробнее!
Just Do It!
3743 / 2048 / 629
Регистрация: 23.09.2014
Сообщений: 6,518
Записей в блоге: 2
Сообщение от Turbo_Pgmer_132 
А ну-ка поподробнее!
вот рабочий пример:Как вводить переменную без перехода в новую строку?
1742 / 1036 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2

Сообщение было отмечено Turbo_Pgmer_132 как решение
Решение
Сообщение от Turbo_Pgmer_132 
А ну-ка поподробнее!
Пожалуйста*****
Поподробнее — читайте руководство по виндовой консоли.
Регистрация: 19.03.2019
Сообщений: 147
L0M
Огромное спасибо.
Только теперь другой вопрос:
Есть ли какая-то команда, чтобы удалить строку? (DelLine, или что-то вроде того )
5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530

Сообщение было отмечено Turbo_Pgmer_132 как решение
Решение
Turbo_Pgmer_132,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include #include #include const char* emptyLine{ " " }; const char* pattern{ "line #" }; const int count = 4; void printline(HANDLE hOut, int num, bool flag) { SetConsoleCursorPosition(hOut, COORD{ 0, (SHORT)num }); if (flag) std::cout pattern num; else std::cout emptyLine; } int main() { bool lines[count]{ 1,1,1,1 }; HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsole == INVALID_HANDLE_VALUE) return -1; std::cout "press key whith line numer to show/hide or Esc to exit:\n"; for (int i{}; i count; ++i) printline(hConsole, i + 1, lines[i]); while (1) { int ch = _getch() - 49; if (ch >= 0 && ch count) { lines[ch] ^= 1; printline(hConsole, ch + 1, lines[ch]); } if (ch == 27 - 49) break; } }
Обнуление строки string
Какой смысл вы вкладываете во «временность» опустошения строки? А в не временном случае должно быть какое-то другое решение?
27 фев 2018 в 12:02
@Kromster что бы сразу отсеять предложения о полном удалении переменной через деструктор.
27 фев 2018 в 12:05
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
m.clear(); if (m.empty())
Отслеживать
ответ дан 27 фев 2018 в 11:57
moskalenco_a moskalenco_a
918 5 5 серебряных знаков 19 19 бронзовых знаков
Так даже лучше. clear() делает одну-единственную операцию — обнуляет поле длины строки. А исходно предлагаемое присваивание «» вызывает попытку скопировать строковый литерал (хоть и состоящий из одного нуль-терминатора).
27 фев 2018 в 12:19
@Arhad у clear сложность линейная, более того: «Effects: Behaves as if the function calls: erase(begin(), end()); «
27 фев 2018 в 14:22
@alexolut, libstdc++ так не думает. clear() вызывает _M_mutate() , передавая ей исходную длину строки и нули в качестве новой длины и смещения. Далее, единственное, что вызывает _M_mutate() с такими аргументами — это _M_set_length_and_sharable() , помечающая буфер общим и выполняющая this->_M_length = __n; . Получаем константную сложность.