Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 11

В строке удалить последующие вхождения первой буквы

23.04.2014, 00:36. Показов 3098. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
[Только начала изучение си. Нужно в строке удалить последующие вхождения первой буквы. Написала программу и не могу понять, почему не выводится результат на экран
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>
int main(void)
{
   char source[100];
   char result[100];
   char en[1];
   int i,len;
   printf("liza");
   scanf("&s",source);
   en[0]=source[0];
 
   for (i=1;i<=100;i++)
   {
    if (en[0]!=source[i])
    {
        result[i]=source[i];
    }
   }
   printf("result is:%s",result);
 
   return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2014, 00:36
Ответы с готовыми решениями:

В строке удалить последующие вхождения первой буквы
Только начала изучение си. Нужно в строке удалить последующие вхождения первой буквы. Написала программу и не могу понять, почему не...

Удалите из слова все последующие вхождения первой буквы
Группы символов, разделенные пробелами (одним или несколькими) и не имеющие пробелов внутри себя, будем называть словами. Дан текст....

Удалить текст в файле, начиная с первой встретившейся буквы ‘М’ до третьей по счету буквы ‘М’
Удалить текст, содержащийся в обрабатываемом файле, начиная с первой встретившейся буквы ‘М’ до третьей по счету буквы ‘М’. Вывести текст...

13
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
23.04.2014, 02:06
Непонятно, зачем делать массив из одного элемента, хотя это корректно. Можно просто char en = source[0];
А вот i<=100 - это грубая ошибка. Должно быть i < 100, потому что нумерация с нуля, и последний элемент - 99.
Кроме того, у тебя символы копируются в результирующую строку на те же позиции, на каких они были в исходной строке. То есть из строки "ababa" получается не "abb", а "ab*b*", где * - это непонятно что. Скорее всего, нули. А нуль в С считается концом строки. Кстати, строка может быть короче 100 символов, а у тебя это не учитывается.
С оформлением беда. Скачай программу astyle и примени стиль 1tbs.
1
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
23.04.2014, 02:42
LizaPovalyaeva, постарался не слишком менять Ваш код.
C
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
#include <stdio.h>
#include <string.h>
 
int main( void ) {
 
    const int len = 100;
    char source[ len ];
    char result[ len ];
 
    printf( "liza\n" ); // перевод строки добавим
    // вместо scanf для строки лучше будет использование
    fgets( source, len, stdin );
    //scanf( "%s", source ); // & не надо, % надо
 
    // en просто переменная, не массив из 1 элемента
    char en = source[ 0 ]; // запомним первый символ исходной строки
    result[ 0 ] = en; // сразу его запишем в результирующую строку
 
    int i, j;
    for ( i = 1, j = 1; i < len; ++i ) { // индексация символов строки начинается с 0 и оканчивается len - 1
        if ( en != source[ i ] ) {
            result[ j++ ] = source[ i ];
        }
    }
    printf( "result is : %s", result );
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 11
23.04.2014, 03:18  [ТС]
Благодарю за оперативный ответ.
Поясните пожалуйста fgets( source, len, stdin ). Что такое stdin?

Добавлено через 6 минут
Надо использовать ещё файлы. я правильно пишу?
C++
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
#include <stdio.h>
#include <string.h>
 
int main( void ) {
    FILE*fi;
    const int len = 100;
    char source[ len ];
    char result[ len ];
    char en = source[ 0 ]; 
    if (fopen("str1.txt","r")!=NULL)
 {
   fi=fopen("str1.txt","r");
   fgets( source, len, fi); 
   result[ 0 ] = en;
   int i, j;
   for ( i = 1, j = 1; i < len; ++i ) {
       if ( en != source[ i ] ) {
           result[ j++ ] = source[ i ];
        }
    }
   close(fi);
   fi= fopen("str1.txt","a+");
   fprintf(fi,"result is :%s\n",result);
   close(fi);
 }
else
 {
 printf("File exists\n");
 }
   return 0;
}
Добавлено через 20 минут
и можно ещё глупый вопрос в чем лучше учиться программировать на си? в институте простят на turbo c, но ваша программа выдаёт 7 ошибок... посоветуйте что исползовать
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
23.04.2014, 03:38
Лучший ответ Сообщение было отмечено LizaPovalyaeva как решение

Решение

LizaPovalyaeva, stdin - это стандартный поток ввода.

На основе Вашего кода с небольшими изменениями. С использованием файла.

C
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
#include <stdio.h>
#include <string.h>
 
int main( void ) {
    FILE* fi;
    const int len = 100;
    char source[ len ];
    char result[ len ];
 
    // пробуем открыть файл только для чтения
    fi = fopen( "str1.txt", "r" );
    if ( fi == NULL ) { // если не смогли открыть файл
        printf( "File read error\n" ); // сообщаем об этом
        return 1; // и выходим из программы
    }
 
    fgets( source, len, fi ); // это мы считываем строку.
    char en = source[ 0 ]; // ТОЛЬКО потом мы можем запомнить ее первый символ
    result[ 0 ] = en;  // сразу его запишем в результирующую строку
 
    int i, j; // в цикле в результирующую строку запишем только нужные символы
    for ( i = 1, j = 1; i < len; ++i ) {
        if ( en != source[ i ] )
            result[ j++ ] = source[ i ];
    }
 
    fclose( fi ); // закроем файл
 
    // пробуем открыть файл только для записи - если файл существовал ранее - он будет перезаписан
    fi = fopen( "str1.txt", "w" );
    if ( fi == NULL ) { // если не смогли открыть файл
        printf( "File write error\n" ); // сообщаем об этом
        return 1; // и выходим из программы
    }
 
    fprintf( fi, "result is : %s\n", result ); // пишем в файл результирующую строку
    fclose( fi ); // закроем файл
 
    return 0;
}
То что просят использовать в университете - уже давно очень устарело. Можно, конечно, под turbo с код подогнать, но Вам изучать устаревшее не рекомендую. Если есть возможность использовать более новые компиляторы и у Вас ОС Windows, то могу порекомендовать MinGW.
Есть IDE Code::Blocks и на официальном сайте есть сборка в комплекте с компилятором MinGW. Вот ссылка на страницу загрузки.
http://www.codeblocks.org/downloads/26
Выбрать для загрузки рекомендую файл codeblocks-13.12mingw-setup.exe
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 11
23.04.2014, 04:04  [ТС]
Спасибо)
вопрос ещё глупее: выбираю создать проект,затем console application?
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
23.04.2014, 04:08
Да, правильно.
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 11
23.04.2014, 04:12  [ТС]
Спасибо огромное!!! теперь все намного понятнее стало. Очень тяжко с паскаля перейти на си, когда познания в си нулевые)))
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
23.04.2014, 04:18
Не за что
Если будете заниматься программированием на си всерьез, то порекомендую прочитать книгу
Брайан Керниган, Деннис Ритчи Язык программирования C. 2-ое издание 2009 год.
Также очень желательно научиться работать с компилятором из командной строки.
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 11
23.04.2014, 04:28  [ТС]
Из командной строки вроде бы получается) получалось точнее.
Спасибо за совет: как раз искала хорошую литературу)

Добавлено через 2 минуты
а вообще у меня mac os и возможно ли программировать на си без использования виртуальной машины с windows?
0
23.04.2014, 04:46

Не по теме:

Mac OS почти не пользовался, у меня только Linux. Судя по тому, что я нашел в google - есть компиляторы C для Mac OS.
Windows для программирования на C вовсе не обязателен.
Стоит заметить, что можно писать программы, которые не зависимы от конкретной ОС и код без изменений будет принят компиляторами как на Windows так и на других ОС . Но также нередки случаи, когда код необходимо подвергать некоторым изменениям, чтобы его принял другой компилятор в другой ОС.
Если будет нужно узнать как программировать на C в Mac OS - то рекомендую поглядеть google - статьи есть в результатах поиска. А если что-то будет непонятно, то нужно создавать отдельную тему для вопроса, так как правила форума гласят - одна тема - один вопрос. Удачи Вам! :)

0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
23.04.2014, 11:23
Советую сразу гуглить на тему, как программировать на Objective-C. Это такой язык, который является надмножеством С. То есть программа на С является одновременно программой на Objective-C (но не наоборот).

Что касается K&R (распространённое сокращение для авторов Керниган и Ритчи), то я полностью согласен, только уточню, что есть издание 2013 года.

Если Вы собираетесь программировать только на C (не на Objective-C или C++) и он Вам нужен только для обучения, то советую пользоваться компилятором TCC. Его основное преимущество - он умеет работать в качестве интерпретатора. То есть пишете "tcc -run file.c" и он исполняет программу file.c. Не надо создавать исполнимый файл. К сожалению, пока что tcc работает под MacOS X только в таком режиме, т.е. для создания реальных программ неприменим.

В программе BlackSpace есть недочёты. Например, она тоже не отслеживает конец строки и лопатит все 100 символов, независимо от того, надо это или нет. И вообще непонятно, зачем копировать в промежуточный буфер, а из промежуточного - в результирующий. Мартышкин труд. Можно же копировать сразу из файла в результат.

C
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
#include <stdio.h>
 
#define MAX_STRING_LENGTH 100
 
// любые повторяющиеся куски кода лучше выносить в отдельные функции
 
int file_error(const char* file_name)
{
    printf("Unable to open file %s!", file_name);
    return 1;
}
 
int main(void)
{
    char result[MAX_STRING_LENGTH + 1]; // предусматриваем дополнительный символ для нуль-терминатора!
    const char* input_file_name = "str1.txt";
    const char* output_file_name = "str2.txt";
 
    FILE* fi = fopen(input_file_name, "r");
    if( fi == NULL ) return file_error(input_file_name);
 
    int en = -1; // используем "невозможный" код символа как признак того, что en ещё не был проинициализирован
    int ch; // распространённая ошибка - использовать здесь тип char. предупреждаю на будущее
    int i = 0;
    while( (ch = fgetc(fi)) != EOF ) { // стандартная идиома языка C для чтения из файла
        if( en == -1 ) { // если en ещё не был проинициализирован, т.е. ch - первый символ
            en = ch; // инициализируем переменную en значением ch
        } else if( ch != en ) {
            result[i++] = (char)ch; // (char) здесь не обязателен, но я предпочитаю приводить типы явно
            if( i == MAX_STRING_LENGTH ) break; // выходим из цикла, достигнув конца буфера
        }
    }
    fclose(f); // закрывать файл сразу, как только он уже не нужен - хорошее правило
    result[i] = '\0'; // вручную ставим нуль-терминатор, не забываем об этом никогда!
 
    fputs(stdin, result); // выводим на экран для контроля, fputs использован для единообразия
 
    fi = fopen(output_file_name, "w");
    if( fi == NULL ) return file_error(output_file_name);
    fputs(fi, result); // выводим в файл так же, как и на экран - удобно! но можно и fprintf
    fclose(fi);
 
    return 0;
}
1
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
23.04.2014, 12:06
Vtulhu, мой код, конечно выполняет лишние операции и имеет другие недочеты, так как цель была изначально минимально менять код автора темы.

с fputs() немного напутали - аргументы местами поменять надо.
fclose( fi )
Ну и Ваш вариант отходит от задания немного.
Нужно удалить не все вхождения первой буквы, а последующие. Так указано в задании.
Далее в задании идет речь именно о буквах, а не о любых символах, то есть надо искать именно первую букву в строке, а не первый символ.
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
23.04.2014, 13:12
Согласен. Что-то я в последнее время ленюсь тестировать код. Удивительно, как легко допустить ошибку даже в самых тривиальных случаях. Моя проблема в том, что я никак не выберу фреймворк для юнит-тестирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2014, 13:12
Помогаю со студенческими работами здесь

В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв
Помогите решить задачу. С клавиатуры вводятся слова через пробел (любой длины и любого количества). на выходе получить следующее: в первой...

Удалить из слов последовательности все предыдущие вхождения последней буквы
Решать задачу не надо!!!, я сама решу, она простая. Просто скажите правильно ли я поняла условие. Дана последовательность из 30 слов....

Рекурсивный поиск первой латинской буквы в строке
=-O #include &lt;ctype.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; /* рекурсивный поиск первой латинской буквы в строке, выдаёт лишь...

Удалить все буквы, символы и оставить в строке только цифры
Нужно удалить все буквы, символы и оставить в строке только цифры. Например вводим : 4fe e4ge 4 t 4etcey55ggh 5h7v64r h Ответ :...

В символьной строке удалить все слова, начинающиеся с гласной буквы
Добрый день,есть задание:В символьной строке удалить все слова, начинающиеся с гласной буквы.Сказали работать с указателями.Я написал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru