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

Как удалить строку c

  • автор:

Удалить строку в массиве через указатель Си

Необходимо удалить из массива строку, в которой заданная буква встречается наибольшее количество раз. Проблема заключается в удалении строки по указателю. То есть, при присвоении строке NULL и при дальнейшем ее выводе через указатель, она не выводится. А при выводе массива целиком, она выводится, словно с ней ничего и не произошло. Вопрос — что тогда меняется по указателю?

#include #include #include #define N 80 #define M 5 void main(void)< char *abc[M]=,*p,**str,**cur,letter; int i=0,buf=0,max=0; str=abc; while(i printf("Enter the letter: "); scanf("%c", &letter); i=0; for(i=0;iwhile(*p!='\0'); if(buf>max) < p=abc[i]; max=buf; cur=&p; buf=0; >buf=0; > *cur=NULL; str=abc; i=0; while(i > 

Отслеживать
Whiskey Motel
задан 14 янв 2018 в 19:42
Whiskey Motel Whiskey Motel
108 1 1 серебряный знак 11 11 бронзовых знаков
Вы хотя бы отформатируйте код, смотрится вырвиглазно.
14 янв 2018 в 20:27
@MrBin отформатировал.
14 янв 2018 в 20:41

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

cur = &p; . *cur = NULL; 

обнуляет лишь какую-то локальную переменную p . На массив abc это обнуление никакого воздействия не оказывает. Потому вы и не видите никаких изменений в массиве abc .

Когда вы искали строку, вам надо было делать

а не какое-то непонятно зачем нужное cur = &p; .

Однако передавать нулевой указатель напрямую в puts нельзя — поведение не определено. Все просто упадет. Некоторые реализации может быть и заметят это и напечатают что-нибудь вроде (null) , но это не повод так поступать.

Отслеживать
ответ дан 14 янв 2018 в 21:44
AnT stands with Russia AnT stands with Russia
69k 3 3 золотых знака 62 62 серебряных знака 139 139 бронзовых знаков

Честно говоря, я по итогу сделал проще — просто избавился от указателя первого порядка, оставив только второй.

15 янв 2018 в 7:23

Честно говоря, разбираться в мельтешении вашего кода откровенно лень 🙂 Если это то, о чём я думаю (то есть просто обнулить указатель на строку в исходном массиве), то как-то так, например:

#include #include /* ---------------------------------------------------------- */ static size_t chars_count( const char *string, char c ) < size_t count = 0; while( string && *string ) < if( *string == c ) ++count; ++string; >return count; > /* ---------------------------------------------------------- */ static int del_strings( char *data[], size_t data_size, char c, size_t n ) < int removed = 0; for( size_t i = 0; i < data_size; ++i ) < size_t count = chars_count( data[i], c ); if( count >= n ) < ++removed; data[i] = NULL; >> return removed; > /* ---------------------------------------------------------- */ static void print_strings( const char *prefix, char *data[], size_t data_size ) < printf( "%s:\n", prefix ); for( size_t i = 0; i < data_size; ++i ) < printf( "[%zu] %s\n", i, data[i] ); >printf( "\n" ); > /* ---------------------------------------------------------- */ int main( void ) < char *abc[] = < "do you", "know de way", "my ugandian warrior", "just follow me", "in aarmy of ugaanda" >; #define ABC_SIZE (sizeof(abc) / sizeof(abc[0])) int rc; print_strings( "Before", abc, ABC_SIZE ); rc = del_strings( abc, ABC_SIZE, 'a', 2 ); print_strings( "After", abc, ABC_SIZE ); return rc; > 

Но имейте в виду, что это потенциально опасный подход.

Удаление символов из строки

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!
3740 / 2044 / 629
Регистрация: 23.09.2014
Сообщений: 6,515
Записей в блоге: 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; } }

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

Как очистить строку, чтобы в ней вообще ничего не было, как при создании?

  • Вопрос задан более трёх лет назад
  • 33594 просмотра

Комментировать

Решения вопроса 0

Ответы на вопрос 5

Taraflex

Ищу работу. Контакты в профиле.

Ответ написан более трёх лет назад

Нравится 5 2 комментария

Nik_Haker @Nik_Haker Автор вопроса

без iostream можно?

donkaban

1. Можно
2. А зачем?
3. А попробовать?

Сверхразум

Ответ написан более трёх лет назад

donkaban

Зачем советовать что бы то ни было СМОТРЕТЬ?

dominqnta

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

baraboshinkg

Константин @baraboshinkg

Программист С/С++

Если C строка то:
str[0] = 0;

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

int len = LEN_SIZE; char *txt; txt = malloc(sizeof(*txt)*len); for(int a = 0 ; a

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

Ваш ответ на вопрос

Войдите, чтобы написать ответ

android

  • Android
  • +2 ещё

Почему FindLibrary выдает 0x0?

  • 1 подписчик
  • 23 часа назад
  • 56 просмотров

cpp

  • C++

Как вычислить порядок погрешности в этом коде по формуле?

  • 1 подписчик
  • вчера
  • 32 просмотра

cpp

  • C++

Почему не выводятся данные в консоль?

  • 1 подписчик
  • вчера
  • 46 просмотров

программирование

  • Программирование
  • +1 ещё

Как автоматизировать работу с .xcf GIMP-шаблоном?

  • 1 подписчик
  • 26 окт.
  • 23 просмотра

программирование

  • Программирование
  • +1 ещё

С чего начать планирование системы управления кафетериями?

  • 2 подписчика
  • 25 окт.
  • 305 просмотров

cpp

  • C++
  • +1 ещё

Как с помощью драйвера отследить появление нового файла в системе?

  • 1 подписчик
  • 25 окт.
  • 91 просмотр

cpp

  • C++

Как реализовать побитовый сдвиг чисел, которые записаны как строки ( длинные числа хранятся в строках)?

  • 1 подписчик
  • 25 окт.
  • 90 просмотров

cpp

  • C++

Как сделать ограничение максимума и минимума в генерации случайных чисел с помощью строк?

  • 1 подписчик
  • 24 окт.
  • 71 просмотр

cpp

  • C++

Почему в консоли отображаются неверные данные строки?

  • 1 подписчик
  • 24 окт.
  • 60 просмотров

программирование

  • Программирование

Как вывести окно с предупреждением по условию в FastReport?

  • 1 подписчик
  • 24 окт.
  • 28 просмотров

от 50 000 до 70 000 ₽

от 100 000 до 200 000 ₽

от 150 000 до 280 000 ₽

29 окт. 2023, в 01:44

3000 руб./за проект

28 окт. 2023, в 23:32

10000 руб./за проект

28 окт. 2023, в 23:09

1000 руб./за проект

Минуточку внимания

Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями

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

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