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

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

  • автор:

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

Необходимо удалить из массива строку, в которой заданная буква встречается наибольшее количество раз. Проблема заключается в удалении строки по указателю. То есть, при присвоении строке 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
69.1k 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; > 

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

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

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

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

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

Решения вопроса 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

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

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

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

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

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

cpp

  • C++

Почему при запуске программы через командную строку на mac выходит segmentation fault 11?

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

cpp

  • C++

Как склеить байты правильно?

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

cpp

  • C++
  • +1 ещё

Где ошибка в коде?

  • 2 подписчика
  • вчера
  • 157 просмотров

linux

  • Linux
  • +3 ещё

Почему в .txt файле на Linux появляется «лишний» байт?

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

cpp

  • C++

В чем ошибка блок-схемы?

  • 1 подписчик
  • 02 нояб.
  • 110 просмотров

cpp

  • C++
  • +1 ещё

Где ошибка в коде С++ и как её исправить?

  • 1 подписчик
  • 01 нояб.
  • 133 просмотра

cpp

  • C++

Не получается скомпилировать код?

  • 1 подписчик
  • 01 нояб.
  • 164 просмотра

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

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

Как сделать логику распространения файла?

  • 1 подписчик
  • 01 нояб.
  • 138 просмотров

cpp

  • C++

Графическая библиотека для C++?

  • 1 подписчик
  • 01 нояб.
  • 170 просмотров

cpp

  • C++

Почему constinit помогает решить проблему static order initialization fiasco?

  • 1 подписчик
  • 01 нояб.
  • 66 просмотров

от 200 000 до 300 000 ₽

от 50 000 до 70 000 ₽

Элеста • Санкт-Петербург

от 130 000 до 200 000 ₽

10 нояб. 2023, в 02:51

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

10 нояб. 2023, в 02:29

2000 руб./в час

10 нояб. 2023, в 00:21

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

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

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

  • Какие есть решения для организации собственной библиотеки?
    • 2 подписчика
    • 1 ответ
    • 3 подписчика
    • 1 ответ
    • 2 подписчика
    • 1 ответ
    • 2 подписчика
    • 0 ответов
    • 3 подписчика
    • 5 ответов
    • 2 подписчика
    • 1 ответ
    • 2 подписчика
    • 1 ответ
    • 2 подписчика
    • 0 ответов
    • 2 подписчика
    • 1 ответ
    • 2 подписчика
    • 0 ответов

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

    🙂 Привет! Глупый и простой вопрос возник. Как мне очистить массив типа char?
    Я делал так:

    char Massiv[100];
    strcpy(Massiv, «»);

    Но так не удобно, да и сам метод примитивен для очистки. Подскажите, как очищать легко и быстро?

    И ещё! Не хчу тему создовать. Кто знает, где можно скачать видеоклип Глюк`oza и песня Невеста. Желательно чтоб размер экрана былы ХОРОШИМ и весь файл НЕ занимал менее 5 Мб. Лучше пусть он занимает мегобайт 20, я его скачать хочу. 8)

    Сообщ. #2 , 27.05.03, 14:55

    Рейтинг (т): 640
    Цитата Владислав, 27.05.03, 18:46:23

    Привет! Глупый и простой вопрос возник. Как мне очистить массив типа char?
    Я делал так:

    char Massiv[100];
    strcpy(Massiv, «»);

    Но так не удобно, да и сам метод примитивен для очистки. Подскажите, как очищать легко и быстро?

    Не совсем понятен вопрос. Нужно обнулить весь массив или сделать строку нулевой длины?
    Если первое — то:
    memset
    FillMemory
    ZeroMemory
    Если второе — то:
    Massiv[0]=0;

    Сообщ. #3 , 27.05.03, 15:12
    Unregistered
    Цитата trainer, 27.05.03, 18:55:26

    Не совсем понятен вопрос. Нужно обнулить весь массив или сделать строку нулевой длины?
    Если первое — то:
    memset
    FillMemory
    ZeroMemory
    Если второе — то:
    Massiv[0]=0;

    Спасибо! Надо только обнулить весь массив. Приведи примерчик. Я думаю это тебе не составит труда.

    ЛЮДИ. ДРУГОЙ ВОПРОС.
    Я создал свой КАДР, т.е. Frame1 объект. Как мне его сохранить так, чтоб я его мог многократно загружать из вкладки с компонентами. Саму вкладку я знаю как создавать. Но как туда положить мой Frame для многократного использования?

    Удалить все буквы из строки

    День добрый, подскажите, пожалуйста. Нужно реализовать вот такую вещь:
    Ввести строку символов, если ее длина >5, удалить все буквы – a..z.

    Лучшие ответы ( 1 )
    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Удалить из строки все гласные буквы
    #include <stdio.h> #include <conio.h> #include <iostream> #include <string.h> void main() < .

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

    6044 / 2159 / 753
    Регистрация: 10.12.2010
    Сообщений: 6,005
    Записей в блоге: 3
    Можно так вот например:

    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 33 34 35 36 37 38 39 40 41 42 43 44 45
    int RemoveLetters(char* const str) { int errorCode = 0; int i = 0; int j = 0; int N = 0; char* tempStr = NULL; if (str == NULL) { errorCode = -1; } else { N = strlen(str) + 1; if (N > 5) { tempStr = malloc(N * sizeof(*tempStr)); if (tempStr == NULL) { errorCode = -1; } else  } if (j > 0) { strcpy(str, tempStr); } } free(tempStr); tempStr = NULL; } } return errorCode; }

    Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

    12123 / 7381 / 1734
    Регистрация: 25.07.2009
    Сообщений: 13,537

    Лучший ответ

    Сообщение было отмечено бутафор как решение

    Решение

    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
    #include #include #include char * remove_if(char * str, int (*func)(int)) { char * s = str; while ( *s ) { if ( func(*s) ) memmove(s, s + 1, strlen(s)); else ++s; } return str; } int main(void) { char buf[BUFSIZ]; while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) printf("Result: %s", ( strlen(buf) > 5 + 1 /* '\n' at the end of string */ ) ? remove_if(buf, isalpha) : buf); return 0; }

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

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